/*---------------------------------------------------------------------------
Copyright (2010): Eran Treister and Irad Yavneh. 
This code is distributed under the terms of the GNU General Public
License 2.0.

Permission to use, copy, modify, and distribute this software
for any purpose without fee is hereby granted, provided that
this entire notice is included in all copies of any software
which is or includes a copy or modification of this software
and in all copies of the supporting documentation for such
software. This software is being provided "as is", without any
express or implied warranty. In particular, the authors do not
make any representation or warranty of any kind concerning the
merchantability of this software or its fitness for any
particular purpose."
---------------------------------------------------------------------------*/
#include "mex.h"
#define inPathIndicator -1
#define inWeightCalcIndicator -2
#define relevantForSearch -3
//*****************************************************************************
class ArrayQueue {
    int maxsize; 
	int* array;
    int start,end;
    bool full;
public:
    ArrayQueue(int maxsize);
    ~ArrayQueue();
    bool isEmpty();
    bool insert(int o);
    int remove();
    int size();
    void increaseCapacity(int* indicator);
};
//*****************************************************************************
class SquareMatrix{
	int N;
	int NNZ;
	int *colIdx; // usually columns
	double *values;
	int *rowStarts;
	int debug;
    public:
          SquareMatrix(int n, int nnz, int* starts, int* otherIdx,
		                     double* vals);
          int nnz();
	      int getColIdx(int i);
	      double getValues(int i);
	      int getRowStarts(int row);
	      int getRowEnds(int row);
	      int numOfNzInRow(int row);
	private:
          int* getStarts(int *sortedIdx, int *otherIdx, int n);
	      int areSorted(int *sortedIdx, int *otherIdx);
};
//*****************************************************************************
class Aggregate{
	public:
           double weight;
	       int len;
           int* members;
           int maxLen;
           Aggregate(int maxLen_);
           ~Aggregate();
           bool isGreaterThan(Aggregate a);
           void copy(Aggregate* other);
           void clean(void);
};
//******************************************************************************
//Function Decleration

ArrayQueue** initializeQueues(int size, int n, SquareMatrix* S, int* numberOfNeighbors);
int getNextMember(ArrayQueue** queues, int* aggregates, int numOfQueues);
int getOnlyNeighborIfExist(SquareMatrix* S, int* aggregates, int seed);
void aggregateOneNeighbor(Aggregate* agg, SquareMatrix* S, int* aggregates, int* numberOfNeighbors, int from, int size);
void addToRelevant(SquareMatrix *S, int* aggregates, int seed, int depth);
void returnRelevant(SquareMatrix *S, int* aggregates, int seed, int depth);
double sumOverPath(Aggregate *path, SquareMatrix *S, int *aggregates);
void DFS(Aggregate* maxAggr, Aggregate* tmpAggr, SquareMatrix *S, int *aggregates, int seed, int size);
void recDFS(Aggregate* max_path, Aggregate* tmp_path, SquareMatrix* S, int* aggregates, int from, int to, int leftToAdd, int pathIdx);
void updateQueues(SquareMatrix *S, Aggregate *path, int member, ArrayQueue** queues,
			int* numberOfNeighbors, int* aggregates, ArrayQueue* tmpQueue, int numOfQueues);
void getAggregation(int* aggregates, int size, int *rowStarts, int *colIdx , double *values, int n, int nnz);

//*******************************************************************************
void mexFunction( int nlhs, mxArray *plhs[],
                  int nrhs, const mxArray *prhs[])
{
    double* tmp = (double*)mxGetData(prhs[0]);//aggSize
    int aggSize = (int)*tmp;
    int* rowStarts = (int*)mxGetData(prhs[1]);
    int* colIdx = (int*)mxGetData(prhs[2]);
    double* values = (double*)mxGetData(prhs[3]);
    tmp = (double*)mxGetData(prhs[4]);
    int N = (int)*tmp;
    tmp = (double*)mxGetData(prhs[5]);
    int NNZ = (int)*tmp;
    int* Out = 0;
    const mwSize *dims;
    dims = mxGetDimensions(prhs[1]);
    //Allocate memory and assign output pointer
    plhs[0] = mxCreateNumericArray(2,dims,mxINT32_CLASS,mxREAL);
    //Get a pointer to the data space in our newly allocated memory
    Out = (int*)mxGetData(plhs[0]);
    getAggregation(Out, aggSize, rowStarts,colIdx ,
                   values, N, NNZ);
}

//*******************************************************************************
void getAggregation(int* aggregates, int size, int *rowStarts, int *colIdx , double *values, int n, int nnz){
	int i, member,*numberOfNeighbors;
	ArrayQueue **queues;
	ArrayQueue tmpQueue(n);
    Aggregate maxAggr(size);  
    Aggregate tmpAggr(size);
    SquareMatrix* S = new SquareMatrix(n, nnz, rowStarts, colIdx, values);
	numberOfNeighbors = new int[n];
	queues = initializeQueues(size, n, S, numberOfNeighbors);
	member = getNextMember(queues,aggregates, size+1);
	while (member!=-1){
          maxAggr.clean();
          tmpAggr.clean();
	      if (numberOfNeighbors[member-1]==1){
             aggregateOneNeighbor(&maxAggr, S, aggregates, numberOfNeighbors, member, size);
          }else{
             DFS(&maxAggr, &tmpAggr, S, aggregates, member, size);
          }
          //cout<<"Agg:";
	      for (i = 0; i < maxAggr.len ; i++){
             //cout<<maxAggr.members[i]<<", ";
	         aggregates[maxAggr.members[i]-1] = member;
	      }
	      //cout<<"\n";
          updateQueues(S, &maxAggr, member, queues, numberOfNeighbors, aggregates, &tmpQueue, size+1);
          member = getNextMember(queues,aggregates,size+1);
	}
	// Memory deallocation
	for (i = 0 ; i <= size ; i++){
	    delete queues[i];
    }
	delete numberOfNeighbors;
    delete queues;
    delete S;
}
//******************************************************************************
void DFS(Aggregate* maxAggr, Aggregate* tmpAggr, SquareMatrix *S, 
                                          int *aggregates, int seed, int size){
    int depth = (size%2==0) ?  (size/2) : ((size-1)/2);
    //cout<<"Aggregating "<<seed<<":";
    addToRelevant(S ,aggregates, seed, depth);
    //cout<<"Are relevant\n";
    recDFS(maxAggr, tmpAggr, S, aggregates, seed, seed, size, 0);
    returnRelevant(S ,aggregates, seed, depth);
}
//******************************************************************************
void recDFS(Aggregate* max_path, Aggregate* tmp_path, SquareMatrix* S,
                 int* aggregates, int from, int to, int leftToAdd, int pathIdx){
   int rowEnds = S->getRowEnds(from);
   int idx = S->getRowStarts(from);
   if (idx == -1){
      return;
   }
   tmp_path->members[pathIdx] = from;
   tmp_path->len++;
   aggregates[from - 1] = inPathIndicator;
   while (idx <= rowEnds){
      int next = S->getColIdx(idx);
      if (next != from){//non-diagonal entry.	
         if (next == to){
			if (tmp_path->len > max_path->len){
               max_path->copy(tmp_path);
			}
			else if (tmp_path->len == max_path->len){
			     if (tmp_path->weight < 1e-12){
			        tmp_path->weight = sumOverPath(tmp_path, S, aggregates);
                 }
			     if (max_path->weight < 1e-12){
			        max_path->weight = sumOverPath(max_path, S, aggregates);
                 }
			     if (tmp_path->weight > max_path->weight){
			        max_path->copy(tmp_path);
                 }
			}
        }
        if (leftToAdd > 1 && aggregates[next - 1] == relevantForSearch){	
			recDFS(max_path, tmp_path, S, aggregates, next, to, leftToAdd - 1, pathIdx+1);
        }
      }
      idx++;
   }
   tmp_path->members[pathIdx] = 0;
   tmp_path->len--;
   if (pathIdx>1){
      aggregates[from - 1] = relevantForSearch;
   }else{
      aggregates[from - 1] = 0;
   }
   return;
}

//******************************************************************************
// There's no way there are members with zero neighbors.
ArrayQueue** initializeQueues(int size, int n, SquareMatrix* S, int* numberOfNeighbors){
	int* bucketSizes = new int[size+1];
	ArrayQueue** queues = new ArrayQueue*[size+1];
	for (int i = 1 ; i < n ; i++){
		numberOfNeighbors[i-1] = S->getRowStarts(i+1) - S->getRowStarts(i); 
	}
	numberOfNeighbors[n-1] = S->nnz() - S->getRowStarts(n);
	for (int i = 0; i < size+1 ; i++){
		bucketSizes[i]=0;
	}
	for (int i = 0; i < n ; i++){
		if ( numberOfNeighbors[i] > size ){
			bucketSizes[size]++;
		}else{	
       		bucketSizes[numberOfNeighbors[i]]++;
		}
	}		
	for (int i = 0; i < size+1 ; i++){
		queues[i] = new ArrayQueue(bucketSizes[i]+((i+1)*n)/size);
	}
	delete bucketSizes;
	for (int i = 0; i < n ; i++){
		if ( numberOfNeighbors[i] > size ){
			queues[size]->insert(i+1);
		}else{
			queues[numberOfNeighbors[i]]->insert(i+1);
		}
	}
	return queues;
}
//******************************************************************************
int getNextMember(ArrayQueue** queues, int* aggregates, int numOfQueues){
    int i,p;
    for (i = 0 ; i < numOfQueues ; i++){
        while(!queues[i]->isEmpty()){
            p = queues[i]->remove();
            if (aggregates[p-1]==0){
               return p;
            }
        }
    }
    return -1;
}
//******************************************************************************
int getOnlyNeighborIfExist(SquareMatrix* S, int* aggregates, int seed){
    int rowEnds = S->getRowEnds(seed);
    int idx = S->getRowStarts(seed);
    if (idx==-1) return 0;
    while (idx <= rowEnds){
        if (aggregates[S->getColIdx(idx)-1] == 0){
           return S->getColIdx(idx);
        }
        ++idx;
    }
    return 0;
}
//******************************************************************************
void aggregateOneNeighbor(Aggregate* agg, SquareMatrix* S, int* aggregates, int* numberOfNeighbors, int from, int size){
    int pathIdx = 2;
    agg->members[0] = from;
    int nei = getOnlyNeighborIfExist(S, aggregates, from);
    agg->members[1] = nei;
    agg->len = 2;
    if (size == 2 || numberOfNeighbors[nei-1]==2){
	   	return;
    }
    int idx = S->getRowStarts(nei);
    if (idx == -1){
		return;
    }
    int rowEnds = S->getRowEnds(nei);
    aggregates[from-1] = -1;
    aggregates[nei-1] = -1;
    while (idx <= rowEnds && pathIdx < size){
		int neiOfNei = S->getColIdx(idx)-1;
		if (aggregates[neiOfNei] == 0 && numberOfNeighbors[neiOfNei]==2){
			agg->members[pathIdx] = neiOfNei+1;
			pathIdx++;
			agg->len++;
		}
		idx++;
    }
    aggregates[nei-1] = 0;
    aggregates[from-1] = 0;
    return;
}
//******************************************************************************
void addToRelevant(SquareMatrix *S, int* aggregates, int seed, int depth){
    int rowEnds = S->getRowEnds(seed);
    int idx = S->getRowStarts(seed);
    while (idx <= rowEnds){
        int next = S->getColIdx(idx);
        if (aggregates[next - 1] == 0){
           //cout<<next<<", ";
           aggregates[next - 1] = relevantForSearch;
        }
        if (depth > 1){
           addToRelevant(S, aggregates, next, depth-1);
        }
        ++idx;
    }
}
//******************************************************************************
void returnRelevant(SquareMatrix* S, int* aggregates, int seed, int depth){
	int rowEnds = S->getRowEnds(seed);
    int idx = S->getRowStarts(seed);
    while (idx <= rowEnds){
        int next = S->getColIdx(idx);
        if (aggregates[next - 1] == relevantForSearch){
           aggregates[next - 1] = 0;
        }
        if (depth > 1){
           returnRelevant(S, aggregates, next, depth-1);
        }
        ++idx;
    }
}
//******************************************************************************
double sumOverPath(Aggregate *path, SquareMatrix *S, int *aggregates){
    int i;
    double ans = 0.0;
    int* temp = new int[path->len];
    for(i = 0 ; i < path->len; ++i){
       temp[i] = aggregates[path->members[i]-1];
    }
    for(int i = 0 ; i < path->len ; ++i){
       int member = path->members[i];
       int rowEnds = S->getRowEnds(member);
       int idx = S->getRowStarts(member);
       while (idx <= rowEnds){
          if (aggregates[S->getColIdx(idx)-1] == inWeightCalcIndicator){
             ans += S->getValues(idx);
          }
          ++idx;
       }
       aggregates[member-1] = inWeightCalcIndicator;
    }
    for(int i = 0 ; i < path->len; ++i){
       aggregates[path->members[i]-1] = temp[i];
    }
    delete temp;
    return ans;
}
//******************************************************************************
	void updateQueues(SquareMatrix *S, Aggregate *path, int member, ArrayQueue** queues,
			int* numberOfNeighbors, int* aggregates, ArrayQueue* tmpQueue, int numOfQueues){
		for (int i = 0; i < path->len ; i++){
			int idx = S->getRowStarts(path->members[i]);
			int rowEnds = S->getRowEnds(path->members[i]);
			if (idx == -1){
				continue; 
			}
			while (idx <= rowEnds){
				int next = S->getColIdx(idx);
				if (aggregates[next-1] == 0){
					if (numberOfNeighbors[next-1] > 0){
						numberOfNeighbors[next-1]--;
						numberOfNeighbors[next-1] *= -1;
						tmpQueue->insert(next);
					}else{ // 0 neighbors is not possible here because we asked path.path[i] who is your neighbor?
						numberOfNeighbors[next-1]++;
					}
				}
				idx++;
			}
			
		}
		while (!tmpQueue->isEmpty()){
			int i = tmpQueue->remove();
			if (numberOfNeighbors[i-1]!=0){
				numberOfNeighbors[i-1] *=-1;
				if (numberOfNeighbors[i-1] > numOfQueues-1){
					if (!queues[numOfQueues-1]->insert(i)){
                        queues[numOfQueues-1]->increaseCapacity(aggregates);
						queues[numOfQueues-1]->insert(i);
					}
				}else{
					if (!queues[numberOfNeighbors[i-1]]->insert(i)){
						queues[numberOfNeighbors[i-1]]->increaseCapacity(aggregates);
						queues[numberOfNeighbors[i-1]]->insert(i);
					}
					queues[numberOfNeighbors[i-1]]->insert(i);
				}
			}else{
                //cout<<"adding a singleton: "<< member<<"\n";
				aggregates[i-1] = member;
			}
		}
	}
//******************************************************************************
//************************ Array-Queue *****************************************
//******************************************************************************
ArrayQueue::ArrayQueue(int max_size){
    maxsize = max_size;
    array = new int[maxsize];
    start = end = 0;
    full = false;
}
ArrayQueue::~ArrayQueue(){
    delete array;
}

bool ArrayQueue::isEmpty(){
    return ((start == end) && !full);
}    
bool ArrayQueue::insert(int o){
    if(!full){
        array[start = (++start % maxsize)] = o;
        if(start == end)
            full = true;
        return true;
    }else{
    	return false;
    }
}
int ArrayQueue::remove(){
    if(full)
        full = false;
    else if(isEmpty())
        return -1;
    return array[end = (++end % maxsize)];
}
int ArrayQueue::size(){
	return maxsize;
}
// indicator - an array on members telling which one should stay (==0)
void ArrayQueue::increaseCapacity(int* indicator){
     int* newArray = new int[2*maxsize];
     int tmp, newStart = 0;
     while (!isEmpty()){
        tmp = remove();
        if (indicator[tmp-1]==0){
           newArray[++newStart] = tmp;
        }
     }
     start = newStart;
     end = 0;
     delete array;
     array = newArray;
     maxsize *= 2;
     full = false;
     
}
//******************************************************************************
//******************************************************************************
//******************************************************************************

//******************************************************************************
//****************** SparseMatrix **********************************************
//******************************************************************************

SquareMatrix::SquareMatrix(int n, int nnz, int* starts, int* otherIdx, double* vals) {
	N = n;
	NNZ = nnz;
	colIdx = otherIdx;
	values = vals;
	rowStarts = starts;
	debug = 1;
}
int SquareMatrix::nnz(){
	return NNZ;
}
int SquareMatrix::getColIdx(int i) {
	return colIdx[i];
}
double SquareMatrix::getValues(int i) {
	return values[i];
}
int SquareMatrix::getRowStarts(int row){
	return rowStarts[row-1];
}
int SquareMatrix::getRowEnds(int row){
	if (rowStarts[row-1]==-1)
		return -2;
	// starts[row-1+1] = starts[row]!
	while (row < N && rowStarts[row]==-1)
	{
		++row;
	}
	return (row==N) ? nnz()-1 : rowStarts[row]-1;
}
int SquareMatrix::numOfNzInRow(int row){
	return (getRowStarts(row)!=-1) ? (getRowEnds(row) - getRowStarts(row) + 1) : -1;
}
/*
int* SquareMatrix::getStarts(int* sortedIdx, int* otherIdx, int n){
	if (!areSorted(sortedIdx, otherIdx)){
		cout<<"ERAN: SquareMatrix not sorted!!!";
		return 0;
	}
	int* starts = new int[n];
	for (int i = 0 ; i < n ; i++){
		starts[i] = -1;
	}
	for (int i = 0 ; i < NNZ ; i++){
		if (starts[sortedIdx[i]-1] == -1){
			starts[sortedIdx[i]-1] = i;
		}			
	}
	return starts;
}

int SquareMatrix::areSorted(int* sortedIdx, int* otherIdx){
	int last = 1;
	while (last < NNZ){
		if (!(sortedIdx[last] > sortedIdx[last-1] || 
				(sortedIdx[last] == sortedIdx[last-1] && otherIdx[last] > otherIdx[last-1]))){
			return 0;
		}
		++last;
	}
	return 1;
}
*/
//******************************************************************************
//******************************************************************************
//******************************************************************************

//******************************************************************************
//********************      Aggregate   ****************************************
//******************************************************************************

Aggregate::Aggregate(int maxLen_) {
	weight = 0;
	len = 0;
	maxLen = maxLen_;
	members = new int[maxLen];
}
Aggregate::~Aggregate(){
    delete members;
}       
bool Aggregate::isGreaterThan(Aggregate a){
	if (len > a.len){
		return true;
	}
	if (len == a.len && weight > a.weight){
		return true;
	}
	return false;
}
void Aggregate::copy(Aggregate* other){
     int i;
     weight = other->weight;
     len = other->len;
     maxLen = other->maxLen;
     for (i = 0 ; i < maxLen ; i++){
         members[i] = other->members[i];
     }
}
void Aggregate::clean(void){
     int i;
     for (i = 0 ; i < maxLen ; i++){
         members[i] = 0;
     }
     weight = 0;
     len = 0;
}
//******************************************************************************
//******************************************************************************
//******************************************************************************
/*
int main()
{

    int rowIdx[] = {1,1,2};
    int colIdx[] = {1,2,1};
    int NNZ = 3;
    int N = 2;
    double vals [] = {1.4,1.5,2.9};
    SquareMatrix S(N,NNZ,rowIdx,colIdx,vals);
    cout << S->rowStarts(1)<<","<<S->rowStarts(2)<<"\n";
    cout << S->rowEnds(2)<<"\n";

       1     2     3     4     5     6     7     8     9        
1:     0     1     0     0     0     1     1     1     0
2:     1     0     0     1     1     0     0     0     0
3:     0     0     0     0     0     1     1     0     1
4:     0     1     0     0     0     0     0     1     0
5:     0     1     0     0     0     0     1     0     1
6:     1     0     1     0     0     0     1     0     0
7:     1     0     1     0     1     1     0     0     0
8:     1     0     0     1     0     0     0     0     0
9:     0     0     1     0     1     0     0     0     0
     
     
     int nnz = 26;
     int n = 9;
     int colIdx[] = {2,6,7,8,
                     1,4,5,
                     6,7,9,
                     2,8,
                     2,7,9,
                     1,3,7,
                     1,3,5,6,
                     1,4,
                     3,5};
     int rowStarts[] = {0,4,7,10,12,15,18,22,24};
     double vals[] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
     int aggregates[] = {0,0,0,0,0,0,0,0,0};

     int n = 740;
     int nnz = 5662;
     int colIdx[] = {2,3,4,5,24,32,1,6,7,8,9,12,1,6,7,10,11,12,1,13,14,15,16,19,1,15,16,17,18,19,2,3,20,21,22,23,24,27,28,44,2,3,20,21,24,25,26,27,29,45,2,22,28,29,30,31,32,36,39,50,2,23,30,31,33,34,35,36,40,54,3,25,28,29,32,37,38,39,41,51,3,26,33,34,35,37,38,40,41,55,2,3,27,39,42,43,4,22,24,42,44,45,46,47,50,58,4,25,27,42,44,45,48,49,51,59,4,5,30,32,46,50,51,52,53,4,5,31,32,35,47,52,53,54,55,5,23,24,43,46,47,54,56,57,58,5,26,27,43,48,49,55,56,57,59,4,5,35,36,41,58,6,7,60,61,62,63,70,87,6,7,60,61,64,65,71,88,6,8,13,62,64,66,67,72,80,89,6,9,17,63,65,66,67,73,80,90,1,6,7,13,17,7,10,14,62,64,68,69,74,81,91,7,11,18,63,65,68,69,75,81,92,6,7,12,14,18,6,8,10,70,71,72,73,97,7,8,10,70,71,74,75,98,8,9,15,66,72,74,76,77,99,8,9,16,67,73,75,76,77,100,1,8,10,15,16,9,11,72,73,78,79,80,105,9,11,74,75,78,79,81,106,9,11,16,19,8,9,19,80,81,86,10,11,68,72,74,82,83,84,101,10,11,69,73,75,82,83,85,102,8,10,12,84,85,9,11,85,86,10,11,19,80,81,86,12,13,14,84,85,86,12,17,18,84,85,86,6,13,14,87,88,89,90,97,7,13,14,87,88,91,92,98,13,15,17,66,89,91,93,94,99,13,16,17,67,90,92,93,94,100,14,18,68,84,89,91,95,96,101,14,18,69,85,90,92,95,96,102,8,13,15,84,97,98,99,100,10,14,15,84,97,98,101,102,15,16,76,93,99,101,103,104,15,16,77,94,100,102,103,104,9,16,17,85,99,100,105,106,11,16,18,85,101,102,105,106,17,18,80,89,90,105,107,108,17,18,81,91,92,106,107,108,13,17,19,80,81,14,18,80,81,86,20,21,109,110,111,112,20,21,109,110,113,114,20,22,25,111,113,115,116,125,145,20,23,26,112,114,115,116,126,137,146,21,22,25,111,113,117,118,127,138,147,21,23,26,112,114,117,118,128,138,148,22,23,30,46,115,117,119,120,129,149,22,23,31,47,116,118,119,120,130,150,25,26,37,48,115,117,121,122,131,151,25,26,38,49,116,118,121,122,132,152,20,28,29,123,124,125,126,157,21,28,29,123,124,127,128,22,28,30,33,37,125,127,129,130,159,23,28,31,33,38,126,128,129,130,160,25,29,30,34,37,125,127,131,132,161,26,29,31,34,38,126,128,131,132,162,30,31,52,119,129,131,133,134,163,30,31,53,120,130,132,133,134,164,33,34,125,126,135,136,137,33,34,128,135,136,138,22,23,33,36,41,56,58,59,137,138,25,26,34,36,41,57,58,59,137,138,37,38,121,129,131,139,140,141,165,37,38,122,130,132,139,140,142,166,37,39,42,43,48,50,51,141,142,38,39,40,42,43,49,54,55,141,142,36,40,41,42,43,59,20,44,45,143,144,145,146,157,21,44,45,143,144,147,148,22,44,46,48,56,145,147,149,150,159,23,44,47,49,56,146,148,149,150,160,25,45,46,48,57,145,147,151,152,161,26,45,47,49,57,146,148,151,152,162,46,47,52,119,149,151,153,154,163,46,47,53,120,150,152,153,154,164,48,49,121,141,149,151,155,156,165,48,49,122,142,150,152,155,156,166,28,44,50,51,157,158,159,160,29,45,50,51,157,158,161,162,30,46,50,52,54,141,159,161,163,164,31,47,50,53,54,142,160,162,163,164,37,48,51,52,55,141,159,161,165,166,38,49,51,53,55,142,160,162,165,166,52,53,133,153,163,165,167,168,52,53,134,154,164,166,167,168,33,54,55,56,160,169,170,34,54,55,57,162,169,170,56,57,137,145,146,169,171,172,56,57,138,148,171,172,60,61,173,176,60,61,174,178,60,62,64,175,177,179,180,60,63,65,176,180,61,62,64,175,177,181,182,61,63,65,176,178,182,62,63,66,68,179,181,183,184,62,63,67,69,180,182,183,184,198,222,64,65,66,68,179,181,185,186,199,223,64,65,67,69,180,182,185,186,200,224,66,67,76,93,183,185,187,188,201,225,66,67,77,94,184,186,187,188,202,226,68,69,82,95,183,185,189,190,203,227,68,69,83,96,184,186,189,190,204,228,70,71,191,192,193,194,70,71,191,192,195,196,62,70,72,74,78,193,195,197,198,235,63,70,73,75,78,194,196,197,198,236,64,71,72,74,193,195,199,200,237,65,71,73,75,79,194,196,199,200,238,66,72,73,76,82,197,199,201,202,239,67,72,73,77,83,198,200,201,202,240,68,74,75,76,82,197,199,203,204,241,69,74,75,77,83,198,200,203,204,242,76,77,103,187,201,203,205,206,243,76,77,104,188,202,204,205,206,244,78,79,194,207,208,78,79,196,207,208,210,63,78,80,81,107,209,210,64,65,79,80,81,108,209,210,82,83,189,201,203,211,212,213,245,82,83,190,202,204,211,212,214,246,82,84,85,95,99,101,213,214,83,84,85,96,100,102,213,214,87,88,215,216,217,218,87,88,215,216,219,220,62,87,89,91,107,217,219,221,222,235,63,87,90,92,107,218,220,221,222,236,64,88,89,91,217,219,223,224,237,65,88,90,92,108,218,220,223,224,238,66,89,90,93,95,221,223,225,226,239,67,89,90,94,96,222,224,225,226,240,68,91,92,93,95,221,223,227,228,241,69,91,92,94,96,222,224,227,228,242,93,94,103,187,225,227,229,230,243,93,94,104,188,226,228,229,230,244,95,96,189,213,225,227,231,232,245,95,96,190,214,226,228,231,232,246,70,87,97,98,233,234,235,236,97,98,233,234,238,72,89,97,99,101,235,237,239,240,73,90,97,100,102,105,236,238,239,240,74,91,98,99,101,235,237,241,242,75,92,98,100,102,106,236,238,241,242,76,93,99,100,103,213,239,241,243,244,77,94,99,100,104,214,240,242,243,244,82,95,101,102,103,213,239,241,245,246,83,96,101,102,104,214,240,242,245,246,103,104,205,229,243,245,247,248,103,104,206,230,244,246,247,248,105,106,107,236,249,250,105,106,238,249,250,107,108,218,251,252,107,108,210,220,251,252,109,253,256,110,254,258,111,113,255,259,260,109,112,114,256,260,111,113,255,257,262,110,114,258,262,111,115,117,259,261,263,264,111,112,116,118,260,264,113,115,117,259,261,265,266,113,114,116,118,260,262,266,115,116,119,121,263,265,267,268,115,116,120,122,264,266,267,268,117,118,119,121,263,265,269,270,117,118,120,122,264,266,269,270,119,120,133,153,267,269,271,272,289,317,119,120,134,154,268,270,271,272,290,318,121,122,139,155,267,269,273,274,291,319,121,122,140,156,268,270,273,274,292,320,123,124,275,276,277,278,123,124,275,276,279,280,123,125,127,277,279,281,282,327,123,126,128,135,278,280,281,282,328,124,125,127,277,279,283,284,124,126,128,136,278,280,283,284,125,126,129,131,281,283,285,286,331,116,125,126,130,132,282,284,285,286,332,117,127,128,129,131,281,283,287,288,333,118,127,128,130,132,282,284,287,288,334,119,129,130,133,139,285,287,289,290,335,120,129,130,134,140,286,288,289,290,336,121,131,132,133,139,285,287,291,292,337,122,131,132,134,140,286,288,291,292,338,133,134,167,271,289,291,293,294,339,133,134,168,272,290,292,293,294,340,135,136,278,295,296,135,136,295,296,137,138,297,136,137,138,172,297,298,139,140,273,289,291,299,300,301,341,139,140,274,290,292,299,300,302,342,139,141,142,155,163,165,301,302,140,141,142,156,164,166,301,302,143,144,303,304,305,306,143,144,303,304,307,308,143,145,147,305,307,309,310,327,143,146,148,171,306,308,309,310,328,144,145,147,305,307,311,312,144,146,148,172,306,308,311,312,145,146,149,151,309,311,313,314,331,116,145,146,150,152,310,312,313,314,332,117,147,148,149,151,309,311,315,316,333,118,147,148,150,152,310,312,315,316,334,119,149,150,153,155,313,315,317,318,335,120,149,150,154,156,314,316,317,318,336,121,151,152,153,155,313,315,319,320,337,122,151,152,154,156,314,316,319,320,338,153,154,167,271,317,319,321,322,339,153,154,168,272,318,320,321,322,340,155,156,273,301,317,319,323,324,341,155,156,274,302,318,320,323,324,342,157,158,325,326,327,328,157,158,325,326,330,125,145,157,159,161,327,329,331,332,126,146,157,160,162,169,328,330,331,332,127,147,159,161,327,329,333,334,128,148,158,160,162,170,328,330,333,334,129,149,159,160,163,165,331,333,335,336,130,150,159,160,164,166,332,334,335,336,131,151,161,162,163,165,331,333,337,338,132,152,161,162,164,166,332,334,337,338,133,153,163,164,167,301,335,337,339,340,134,154,163,164,168,302,336,338,339,340,139,155,165,166,167,301,335,337,341,342,140,156,165,166,168,302,336,338,341,342,167,168,293,321,339,341,343,344,167,168,294,322,340,342,343,344,169,170,328,345,346,169,170,345,346,171,172,306,347,348,171,172,347,348,173,349,351,352,174,350,354,175,177,351,355,356,173,176,352,356,177,351,353,358,174,178,354,358,175,179,181,355,359,360,175,176,180,182,356,360,179,181,355,357,362,177,178,182,356,358,362,179,183,185,359,363,364,179,180,184,186,360,363,364,181,183,185,359,361,365,366,181,182,184,186,360,362,366,183,184,187,189,363,365,367,368,183,184,188,190,364,367,368,185,186,187,189,363,365,369,370,185,186,188,190,364,366,369,370,187,188,205,229,367,369,371,372,187,188,206,230,368,371,372,189,190,211,231,367,369,373,374,395,427,189,190,212,232,368,370,373,374,396,428,191,192,375,377,378,191,192,375,376,379,380,191,193,195,377,379,381,382,191,194,196,207,378,380,381,382,192,193,195,377,379,383,384,192,194,196,378,380,383,384,193,194,197,199,381,383,385,386,439,193,194,198,200,382,384,385,386,440,195,196,197,199,381,383,387,388,195,196,198,200,382,384,387,388,197,198,201,203,385,387,389,390,443,197,198,202,204,386,388,389,390,444,199,200,201,203,385,387,391,392,445,199,200,202,204,386,388,391,392,446,187,201,202,205,211,389,391,393,394,447,188,201,202,206,212,390,392,393,394,448,189,203,204,205,211,389,391,395,396,449,190,203,204,206,212,390,392,395,396,450,205,206,247,371,393,395,397,398,451,205,206,248,372,394,396,397,398,452,207,208,399,207,208,400,209,210,401,210,402,211,212,373,393,395,403,404,405,453,211,212,374,394,396,403,404,406,454,211,213,214,231,243,245,405,406,212,213,214,232,244,246,405,406,215,216,407,409,410,215,216,407,408,411,412,215,217,219,409,411,413,414,215,218,220,251,410,412,413,414,216,217,219,409,411,415,416,216,218,220,410,412,415,416,217,218,221,223,413,415,417,418,439,217,218,222,224,414,416,417,418,440,219,220,221,223,413,415,419,420,219,220,222,224,414,416,419,420,221,222,225,227,417,419,421,422,443,221,222,226,228,418,420,421,422,444,223,224,225,227,417,419,423,424,445,223,224,226,228,418,420,423,424,446,187,225,226,229,231,421,423,425,426,447,188,225,226,230,232,422,424,425,426,448,189,227,228,229,231,421,423,427,428,449,190,227,228,230,232,422,424,427,428,450,229,230,247,371,425,427,429,430,451,229,230,248,372,426,428,429,430,452,231,232,373,405,425,427,431,432,453,231,232,374,406,426,428,431,432,454,233,234,433,434,436,233,234,433,434,438,193,217,233,235,237,435,437,439,440,194,218,233,236,238,249,436,438,439,440,235,237,435,437,441,442,234,236,238,436,438,441,442,197,221,235,236,239,241,439,441,443,444,198,222,235,236,240,242,440,442,443,444,199,223,237,238,239,241,439,441,445,446,200,224,237,238,240,242,440,442,445,446,201,225,239,240,243,245,443,445,447,448,202,226,239,240,244,246,444,446,447,448,203,227,241,242,243,245,443,445,449,450,204,228,241,242,244,246,444,446,449,450,205,229,243,244,247,405,447,449,451,452,206,230,243,244,248,406,448,450,451,452,211,231,245,246,247,405,447,449,453,454,212,232,245,246,248,406,448,450,453,454,247,248,397,429,451,453,455,456,247,248,398,430,452,454,455,456,249,250,457,458,249,250,457,458,251,252,459,251,252,460,253,461,463,464,254,462,465,466,253,255,257,463,467,468,253,256,464,467,468,257,463,465,470,254,258,464,466,470,255,259,261,467,471,472,255,256,260,262,468,471,472,261,467,469,474,257,258,262,468,470,474,259,263,265,471,475,476,259,260,264,266,472,475,476,265,471,473,477,478,261,262,266,472,474,478,263,264,267,269,475,479,480,263,264,268,270,476,479,480,265,267,269,475,477,481,482,265,266,270,476,478,481,482,267,268,271,273,479,481,483,484,267,268,272,274,480,483,484,269,270,271,273,479,481,485,486,269,270,274,480,482,485,486,271,272,293,321,483,485,487,488,271,272,294,322,484,487,488,273,274,299,323,483,485,489,490,515,551,273,274,300,324,484,486,489,490,516,552,275,276,491,276,492,275,277,279,493,275,278,280,494,276,277,279,493,495,276,278,280,494,496,277,278,281,283,497,501,502,277,278,282,284,498,502,279,280,281,283,497,499,503,504,279,280,282,284,498,500,504,281,282,285,287,501,503,505,506,567,281,282,286,288,502,504,505,506,568,283,284,285,287,501,503,507,508,283,284,286,288,502,504,507,508,285,286,289,291,505,507,509,510,571,285,286,290,292,506,508,509,510,572,287,288,289,291,505,507,511,512,573,287,288,290,292,506,508,511,512,574,289,290,293,299,509,511,513,514,575,289,290,294,300,510,512,513,514,576,273,291,292,293,299,509,511,515,516,577,274,291,292,294,300,510,512,515,516,578,293,294,343,487,513,515,517,518,579,293,294,344,488,514,516,517,518,580,295,519,296,520,297,521,298,522,299,300,489,513,515,523,524,525,581,299,300,490,514,516,523,524,526,582,299,301,302,323,339,341,525,526,300,301,302,324,340,342,525,526,303,304,527,304,528,303,305,307,529,303,306,308,530,304,305,307,529,531,304,306,308,530,532,305,306,309,311,533,537,538,305,306,310,312,534,538,307,308,309,311,533,535,539,540,307,308,310,312,534,536,540,309,310,313,315,537,539,541,542,567,309,310,314,316,538,540,541,542,568,311,312,313,315,537,539,543,544,311,312,314,316,538,540,543,544,313,314,317,319,541,543,545,546,571,313,314,318,320,542,544,545,546,572,315,316,317,319,541,543,547,548,573,315,316,318,320,542,544,547,548,574,317,318,321,323,545,547,549,550,575,317,318,322,324,546,548,549,550,576,273,319,320,321,323,545,547,551,552,577,274,319,320,322,324,546,548,551,552,578,321,322,343,487,549,551,553,554,579,321,322,344,488,550,552,553,554,580,323,324,489,525,549,551,555,556,581,323,324,490,526,550,552,555,556,582,325,326,557,558,560,325,326,557,558,562,327,329,559,561,563,564,325,328,330,560,562,563,564,327,329,559,561,565,566,326,328,330,560,562,566,281,309,327,328,331,333,563,565,567,568,282,310,327,328,332,334,564,566,567,568,329,330,331,333,563,565,569,570,329,330,332,334,564,566,569,570,285,313,331,332,335,337,567,569,571,572,286,314,331,332,336,338,568,570,571,572,287,315,333,334,335,337,567,569,573,574,288,316,333,334,336,338,568,570,573,574,289,317,335,336,339,341,571,573,575,576,290,318,335,336,340,342,572,574,575,576,291,319,337,338,339,341,571,573,577,578,292,320,337,338,340,342,572,574,577,578,293,321,339,340,343,525,575,577,579,580,294,322,339,340,344,526,576,578,579,580,299,323,341,342,343,525,575,577,581,582,300,324,341,342,344,526,576,578,581,582,343,344,517,553,579,581,583,584,343,344,518,554,580,582,583,584,345,346,585,586,345,346,585,586,347,587,348,588,349,589,590,591,592,350,589,590,593,594,349,351,353,591,593,595,596,349,352,354,592,594,595,596,657,350,353,591,593,597,598,350,354,592,594,597,598,658,351,352,355,357,595,597,599,600,351,352,356,358,596,598,599,600,357,595,597,601,602,353,354,358,596,598,601,602,355,356,359,361,599,601,603,604,355,356,360,362,600,602,603,604,361,599,601,605,606,357,358,362,600,602,605,606,359,360,363,365,603,605,607,608,359,360,364,366,604,606,607,608,361,365,603,605,609,610,361,362,366,604,606,609,610,363,364,367,369,607,609,611,612,363,364,368,370,608,610,611,612,365,366,367,369,607,609,613,614,365,366,370,608,610,613,614,367,368,371,373,611,613,615,616,367,368,372,374,612,614,615,616,369,370,371,373,611,613,617,618,369,370,374,612,614,617,618,371,372,397,429,615,617,619,620,649,689,371,372,398,430,616,618,619,620,650,690,373,374,403,431,615,617,621,622,651,691,373,374,404,432,616,618,621,622,652,692,375,623,625,626,376,623,624,628,377,379,625,630,699,378,380,626,700,379,625,627,701,380,626,628,702,381,383,629,634,703,382,384,630,704,383,629,631,705,384,630,632,706,381,385,387,633,637,638,707,381,382,386,388,634,638,708,383,385,387,633,635,640,709,383,384,386,388,634,636,710,385,386,389,391,637,641,642,711,385,386,390,392,638,641,642,712,387,388,389,391,637,639,643,644,713,387,388,390,392,638,640,643,644,714,389,390,393,395,641,643,645,646,715,389,390,394,396,642,644,645,646,716,391,392,393,395,641,643,647,648,717,391,392,394,396,642,644,647,648,718,393,394,397,403,645,647,649,650,719,393,394,398,404,646,648,649,650,720,373,395,396,397,403,645,647,651,652,721,374,395,396,398,404,646,648,651,652,722,397,398,455,619,649,651,653,654,723,397,398,456,620,650,652,653,654,724,399,625,626,655,400,628,655,656,401,657,402,658,403,404,621,649,651,659,660,661,725,403,404,622,650,652,659,660,662,726,403,405,406,431,451,453,661,662,404,405,406,432,452,454,661,662,407,663,665,666,408,663,664,668,409,411,665,670,699,410,412,666,700,411,665,667,701,412,666,668,702,413,415,669,674,703,414,416,670,704,415,669,671,705,416,670,672,706,413,417,419,673,677,678,707,413,414,418,420,674,678,708,415,417,419,673,675,680,709,415,416,418,420,674,676,710,417,418,421,423,677,681,682,711,417,418,422,424,678,681,682,712,419,420,421,423,677,679,683,684,713,419,420,422,424,678,680,683,684,714,421,422,425,427,681,683,685,686,715,421,422,426,428,682,684,685,686,716,423,424,425,427,681,683,687,688,717,423,424,426,428,682,684,687,688,718,425,426,429,431,685,687,689,690,719,425,426,430,432,686,688,689,690,720,373,427,428,429,431,685,687,691,692,721,374,427,428,430,432,686,688,691,692,722,429,430,455,619,689,691,693,694,723,429,430,456,620,690,692,693,694,724,431,432,621,661,689,691,695,696,725,431,432,622,662,690,692,695,696,726,433,434,433,434,435,437,433,436,438,435,437,434,436,438,435,436,439,441,435,436,440,442,437,439,441,437,438,440,442,385,417,439,440,443,445,386,418,439,440,444,446,441,442,443,445,707,709,441,442,444,446,708,710,389,421,443,444,447,449,715,716,390,422,443,444,448,450,715,716,391,423,445,446,447,449,711,713,718,392,424,445,446,448,450,712,714,718,393,425,447,448,451,453,715,717,719,720,394,426,447,448,452,454,716,718,719,720,395,427,449,450,451,453,715,717,721,722,396,428,449,450,452,454,716,718,721,722,397,429,451,452,455,661,719,721,723,724,398,430,451,452,456,662,720,722,723,724,403,431,453,454,455,661,719,721,725,726,404,432,453,454,456,662,720,722,725,726,455,456,653,693,723,725,727,728,455,456,654,694,724,726,727,728,457,458,457,458,459,665,666,731,460,668,731,732,461,462,590,591,593,733,461,462,589,591,593,734,461,463,465,589,590,592,595,597,735,461,464,466,591,596,598,733,734,735,462,463,465,589,590,594,595,597,736,462,464,466,593,596,598,733,734,736,463,464,467,469,591,593,596,599,601,463,464,468,470,592,594,595,600,602,465,466,467,469,591,593,598,599,601,465,466,468,470,592,594,597,600,602,467,468,471,473,595,597,600,603,605,467,468,472,474,596,598,599,604,606,469,470,471,473,595,597,602,603,605,469,470,472,474,596,598,601,604,606,471,472,475,477,599,601,604,607,609,471,472,476,478,600,602,603,608,610,473,474,475,477,599,601,606,607,609,473,474,476,478,600,602,605,608,610,475,476,479,481,603,605,608,611,613,475,476,480,482,604,606,607,612,614,477,478,479,481,603,605,610,611,613,477,478,480,482,604,606,609,612,614,479,480,483,485,607,609,612,615,617,479,480,484,486,608,610,611,616,618,481,482,483,485,607,609,614,615,617,481,482,484,486,608,610,613,616,618,483,484,487,489,611,613,616,619,621,483,484,488,490,612,614,615,620,622,485,486,487,489,611,613,618,619,621,485,486,488,490,612,614,617,620,622,487,488,517,553,615,617,620,487,488,518,554,616,618,619,489,490,523,555,615,617,622,489,490,524,556,616,618,621,491,492,624,625,627,655,492,623,625,627,656,491,493,495,519,623,624,626,629,631,491,494,496,519,625,630,632,655,656,495,623,624,628,629,631,492,496,520,627,630,632,655,656,497,499,625,627,630,633,635,493,498,500,626,628,629,634,636,499,625,627,632,633,635,500,626,628,631,634,636,501,503,629,631,634,637,639,497,502,504,630,632,633,638,640,503,629,631,636,637,639,504,630,632,635,638,640,501,505,507,633,635,638,641,643,501,502,506,508,634,636,637,642,644,507,633,635,640,641,643,503,508,634,636,639,642,644,505,506,509,511,637,639,642,645,647,505,506,510,512,638,640,641,646,648,507,508,509,511,637,639,644,645,647,507,508,510,512,638,640,643,646,648,509,510,513,515,641,643,646,649,651,509,510,514,516,642,644,645,650,652,511,512,513,515,641,643,648,649,651,511,512,514,516,642,644,647,650,652,487,513,514,517,523,645,647,650,653,659,488,513,514,518,524,646,648,649,654,660,489,515,516,517,523,645,647,652,653,659,490,515,516,518,524,646,648,651,654,660,517,518,583,649,651,654,517,518,584,650,652,653,519,520,623,626,628,656,520,624,626,628,655,464,521,735,466,522,736,523,524,649,651,660,737,523,524,650,652,659,738,523,525,526,555,579,581,737,738,524,525,526,556,580,582,737,738,527,528,664,665,667,731,528,663,665,667,732,527,529,531,587,663,664,666,669,671,527,530,532,587,665,670,672,731,732,531,663,664,668,669,671,528,532,588,667,670,672,731,732,533,535,665,667,670,673,675,529,534,536,666,668,669,674,676,535,665,667,672,673,675,536,666,668,671,674,676,537,539,669,671,674,677,679,533,538,540,670,672,673,678,680,539,669,671,676,677,679,540,670,672,675,678,680,537,541,543,673,675,678,681,683,537,538,542,544,674,676,677,682,684,543,673,675,680,681,683,539,544,674,676,679,682,684,541,542,545,547,677,679,682,685,687,541,542,546,548,678,680,681,686,688,543,544,545,547,677,679,684,685,687,543,544,546,548,678,680,683,686,688,545,546,549,551,681,683,686,689,691,545,546,550,552,682,684,685,690,692,547,548,549,551,681,683,688,689,691,547,548,550,552,682,684,687,690,692,487,549,550,553,555,685,687,690,693,695,488,549,550,554,556,686,688,689,694,696,489,551,552,553,555,685,687,692,693,695,490,551,552,554,556,686,688,691,694,696,553,554,583,689,691,694,553,554,584,690,692,693,555,556,689,691,696,737,555,556,690,692,695,738,698,699,701,729,697,699,701,730,493,529,697,698,700,703,705,494,530,699,704,706,729,730,495,531,697,698,702,703,705,496,532,701,704,706,729,730,497,533,699,701,704,707,709,498,534,700,702,703,708,710,499,535,699,701,706,707,709,500,536,700,702,705,708,710,501,537,569,703,705,708,711,713,502,538,570,704,706,707,712,714,503,539,569,703,705,710,711,713,504,540,570,704,706,709,712,714,505,541,573,707,709,712,715,717,506,542,574,708,710,711,716,718,507,543,573,707,709,714,715,717,508,544,574,708,710,713,716,718,509,545,571,572,575,577,711,713,716,719,721,510,546,571,572,576,578,712,714,715,720,722,511,547,575,577,711,713,718,719,721,512,548,573,574,576,578,712,714,717,720,722,513,549,575,576,579,581,715,717,720,723,725,514,550,575,576,580,582,716,718,719,724,726,515,551,577,578,579,581,715,717,722,723,725,516,552,577,578,580,582,716,718,721,724,726,517,553,579,580,583,719,721,724,727,737,739,518,554,579,580,584,720,722,723,728,738,740,523,555,581,582,583,719,721,726,727,737,739,524,556,581,582,584,720,722,725,728,738,740,583,584,723,725,728,583,584,724,726,727,697,700,702,730,698,700,702,729,587,588,663,666,668,732,588,664,666,668,731,589,592,594,734,735,736,590,592,594,733,735,736,591,592,657,733,734,593,594,658,733,734,659,661,662,695,723,725,739,740,660,661,662,696,724,726,739,740,723,725,737,738,740,724,726,737,738,739};
     int rowStarts[] = {0,6,12,18,24,30,40,50,60,70,80,90,96,106,116,125,135,145,155,161,169,177,187,197,202,212,222,227,235,243,252,261,266,274,282,286,292,301,310,315,319,325,331,337,345,353,362,371,380,389,397,405,413,421,429,437,445,453,458,463,469,475,484,494,504,514,524,534,544,554,562,569,579,589,599,609,618,627,634,640,650,660,669,678,687,697,703,711,718,728,738,748,758,767,776,785,794,802,810,820,830,840,850,858,866,873,880,888,894,898,902,909,914,921,927,935,945,955,965,975,985,995,1005,1011,1017,1027,1037,1046,1056,1066,1076,1086,1096,1105,1114,1119,1125,1132,1140,1149,1158,1166,1174,1180,1186,1196,1206,1215,1225,1235,1245,1255,1265,1274,1283,1292,1301,1309,1314,1323,1333,1342,1352,1362,1372,1382,1392,1400,1408,1414,1419,1424,1430,1433,1436,1441,1446,1451,1455,1462,1468,1475,1482,1490,1498,1506,1514,1524,1534,1544,1554,1560,1566,1574,1583,1590,1598,1607,1617,1627,1637,1647,1657,1667,1677,1686,1695,1700,1704,1707,1713,1722,1731,1739,1747,1753,1759,1767,1776,1783,1791,1800,1810,1820,1830,1840,1850,1860,1870,1879,1888,1897,1906,1912,1917,1926,1936,1944,1954,1964,1974,1984,1994,2004,2014,2024,2034,2042,2050,2055,2059,2064,2068,2072,2075,2080,2084,2088,2092,2098,2104,2109,2115,2121,2128,2135,2142,2150,2157,2165,2173,2181,2188,2198,2208,2213,2219,2226,2234,2241,2248,2257,2266,2274,2282,2291,2300,2309,2318,2328,2338,2348,2358,2367,2376,2379,2382,2385,2387,2396,2405,2413,2421,2426,2432,2439,2447,2454,2461,2470,2479,2487,2495,2504,2513,2522,2531,2541,2551,2561,2571,2580,2589,2598,2607,2612,2617,2626,2636,2642,2649,2659,2669,2679,2689,2699,2709,2719,2729,2739,2749,2759,2769,2777,2785,2789,2793,2796,2799,2803,2807,2813,2818,2822,2827,2833,2840,2844,2850,2856,2863,2868,2874,2881,2888,2895,2902,2910,2917,2925,2932,2940,2947,2957,2967,2970,2972,2976,2980,2985,2990,2997,3003,3011,3018,3027,3036,3044,3052,3061,3070,3079,3088,3097,3106,3116,3126,3135,3144,3146,3148,3150,3152,3161,3170,3178,3186,3189,3191,3195,3199,3204,3209,3216,3222,3230,3237,3246,3255,3263,3271,3280,3289,3298,3307,3316,3325,3335,3345,3354,3363,3372,3381,3386,3391,3397,3404,3410,3416,3426,3436,3444,3452,3462,3472,3482,3492,3502,3512,3522,3532,3542,3552,3562,3572,3580,3588,3592,3596,3598,3600,3605,3610,3617,3625,3631,3638,3646,3654,3659,3666,3674,3682,3687,3694,3702,3710,3716,3723,3731,3739,3747,3754,3762,3770,3778,3785,3795,3805,3815,3825,3829,3833,3838,3842,3846,3850,3855,3859,3863,3867,3874,3881,3888,3895,3903,3911,3920,3929,3938,3947,3956,3965,3974,3983,3993,4003,4012,4021,4025,4029,4031,4033,4042,4051,4059,4067,4071,4075,4080,4084,4088,4092,4097,4101,4105,4109,4116,4123,4130,4137,4145,4153,4162,4171,4180,4189,4198,4207,4216,4225,4235,4245,4254,4263,4272,4281,4283,4285,4287,4290,4292,4295,4299,4303,4306,4310,4316,4322,4328,4334,4342,4350,4359,4368,4378,4388,4398,4408,4418,4428,4438,4448,4456,4464,4466,4468,4472,4476,4482,4488,4497,4506,4515,4524,4533,4542,4551,4560,4569,4578,4587,4596,4605,4614,4623,4632,4641,4650,4659,4668,4677,4686,4695,4704,4713,4722,4731,4740,4747,4754,4761,4768,4774,4779,4788,4797,4803,4811,4818,4826,4832,4838,4845,4853,4859,4865,4873,4882,4888,4895,4904,4913,4922,4931,4940,4949,4958,4967,4977,4987,4997,5007,5013,5019,5025,5030,5033,5036,5042,5048,5056,5064,5070,5075,5084,5093,5099,5107,5114,5122,5128,5134,5141,5149,5155,5161,5169,5178,5184,5191,5200,5209,5218,5227,5236,5245,5254,5263,5273,5283,5293,5303,5309,5315,5321,5327,5331,5335,5342,5349,5356,5363,5370,5377,5384,5391,5399,5407,5415,5423,5431,5439,5447,5455,5466,5477,5486,5497,5508,5519,5530,5541,5552,5563,5574,5585,5590,5595,5599,5603,5609,5614,5620,5626,5631,5636,5644,5652,5657};
     double vals[] = {0.42,0.31,0.68,0.29,0.14,0.34,0.42,0.45,0.16,0.72,0.38,0.28,0.31,0.42,0.88,0.78,0.46,0.96,0.68,0.31,0.30,0.57,0.12,0.11,0.29,0.07,0.61,0.30,0.30,0.68,0.45,0.42,0.64,0.14,0.17,0.34,0.40,0.22,0.19,0.19,0.16,0.88,0.5,0.92,0.10,0.20,0.39,0.65,0.19,0.19,0.72,0.27,0.28,0.18,0.69,0.32,0.26,0.12,0.15,0.15,0.38,0.25,0.16,0.78,0.26,0.17,0.24,0.71,0.14,0.14,0.78,0.32,0.5,0.66,0.20,0.73,0.39,0.62,0.16,0.25,0.46,0.31,0.5,0.63,0.17,0.20,0.84,0.55,0.76,0.23,0.28,0.96,0.26,0.34,0.69,0.31,0.31,0.27,0.64,0.22,0.28,0.17,0.68,0.32,0.15,0.08,0.30,0.32,0.65,0.74,0.5,0.66,0.74,0.40,0.25,0.09,0.57,0.07,0.07,0.55,0.07,0.37,0.37,0.60,0.17,0.12,0.61,0.07,0.08,0.56,0.07,0.10,0.66,0.36,0.36,0.30,0.26,0.23,0.23,0.15,0.77,0.14,0.25,0.17,0.64,0.30,0.31,0.24,0.71,0.20,0.84,0.23,0.5,0.63,0.64,0.11,0.68,0.28,0.28,0.22,0.09,0.64,0.5,0.54,0.12,0.09,0.21,0.08,0.08,0.14,0.92,0.22,0.71,0.12,0.25,0.07,0.07,0.17,0.27,0.27,0.56,0.11,0.09,0.18,0.15,0.08,0.15,0.34,0.25,0.26,0.58,0.13,0.08,0.15,0.18,0.17,0.18,0.14,0.40,0.10,0.64,0.23,0.20,0.32,0.32,0.19,0.83,0.10,0.19,0.20,0.10,0.20,0.39,0.31,0.31,0.24,0.91,0.09,0.17,0.22,0.20,0.22,0.22,0.65,0.26,0.65,0.24,0.19,0.28,0.5,0.19,0.13,0.12,0.20,0.07,0.19,0.18,0.66,0.5,0.55,0.10,0.17,0.06,0.69,0.16,0.07,0.31,0.31,0.21,0.66,0.27,0.16,0.32,0.78,0.07,0.29,0.31,0.20,0.14,0.74,0.16,0.34,0.26,0.20,0.55,0.08,0.26,0.5,0.09,0.15,0.12,0.12,0.28,0.06,0.17,0.63,0.08,0.13,0.5,0.5,0.24,0.05,0.24,0.17,0.56,0.28,0.12,0.71,0.28,0.34,0.16,0.20,0.73,0.20,0.36,0.5,0.67,0.68,0.30,0.14,0.28,0.39,0.84,0.34,0.5,0.67,0.16,0.77,0.13,0.28,0.15,0.62,0.34,0.55,0.08,0.14,0.55,0.57,0.30,0.16,0.76,0.22,0.5,0.72,0.64,0.69,0.22,0.74,0.57,0.12,0.12,0.31,0.23,0.71,0.07,0.61,0.69,0.19,0.28,0.5,0.19,0.13,0.12,0.20,0.07,0.19,0.17,0.66,0.5,0.55,0.10,0.17,0.06,0.68,0.07,0.15,0.31,0.31,0.21,0.65,0.27,0.16,0.32,0.07,0.77,0.29,0.31,0.20,0.14,0.74,0.16,0.74,0.20,0.36,0.14,0.5,0.67,0.68,0.30,0.28,0.40,0.84,0.34,0.13,0.5,0.67,0.16,0.77,0.28,0.15,0.15,0.37,0.5,0.12,0.12,0.10,0.17,0.25,0.25,0.37,0.5,0.5,0.5,0.09,0.15,0.60,0.10,0.08,0.08,0.37,0.37,0.61,0.17,0.17,0.66,0.08,0.08,0.37,0.37,0.10,0.66,0.14,0.36,0.14,0.5,0.09,0.14,0.12,0.12,0.23,0.36,0.23,0.5,0.08,0.13,0.5,0.5,0.25,0.5,0.28,0.09,0.15,0.06,0.12,0.12,0.17,0.63,0.24,0.08,0.13,0.05,0.5,0.5,0.08,0.64,0.09,0.28,0.10,0.09,0.64,0.27,0.50,0.17,0.54,0.22,0.5,0.05,0.05,0.11,0.12,0.71,0.08,0.65,0.06,0.13,0.09,0.56,0.19,0.5,0.09,0.08,0.15,0.06,0.06,0.21,0.58,0.24,0.55,0.09,0.06,0.11,0.07,0.08,0.07,0.12,0.11,0.83,0.13,0.76,0.09,0.17,0.09,0.05,0.09,0.25,0.13,0.91,0.15,0.78,0.07,0.14,0.11,0.11,0.10,0.09,0.08,0.31,0.31,0.55,0.08,0.08,0.15,0.11,0.11,0.18,0.15,0.29,0.29,0.55,0.09,0.06,0.12,0.13,0.13,0.10,0.09,0.36,0.36,0.12,0.72,0.08,0.15,0.15,0.15,0.19,0.17,0.34,0.34,0.14,0.75,0.07,0.13,0.17,0.17,0.08,0.19,0.5,0.18,0.13,0.08,0.14,0.05,0.07,0.13,0.55,0.5,0.5,0.07,0.12,0.15,0.12,0.31,0.09,0.5,0.24,0.13,0.14,0.24,0.12,0.18,0.20,0.31,0.15,0.5,0.23,0.13,0.12,0.21,0.12,0.20,0.10,0.21,0.08,0.67,0.5,0.59,0.11,0.19,0.10,0.22,0.17,0.20,0.13,0.67,0.5,0.58,0.10,0.17,0.10,0.66,0.14,0.08,0.36,0.33,0.22,0.66,0.26,0.14,0.27,0.74,0.08,0.33,0.32,0.22,0.14,0.73,0.15,0.12,0.5,0.05,0.09,0.12,0.12,0.10,0.12,0.5,0.07,0.5,0.5,0.08,0.08,0.17,0.28,0.34,0.5,0.28,0.28,0.27,0.54,0.13,0.10,0.20,0.24,0.16,0.72,0.24,0.10,0.50,0.5,0.81,0.68,0.16,0.41,0.5,0.67,0.67,0.27,0.14,0.25,0.30,0.77,0.39,0.5,0.67,0.15,0.75,0.14,0.26,0.14,0.55,0.57,0.07,0.14,0.5,0.5,0.60,0.17,0.13,0.08,0.57,0.12,0.61,0.13,0.5,0.5,0.10,0.66,0.20,0.30,0.64,0.12,0.69,0.17,0.08,0.19,0.5,0.18,0.13,0.08,0.14,0.05,0.07,0.13,0.55,0.5,0.5,0.07,0.12,0.15,0.12,0.31,0.5,0.09,0.24,0.13,0.14,0.24,0.12,0.18,0.20,0.31,0.5,0.15,0.23,0.13,0.12,0.21,0.12,0.20,0.10,0.21,0.67,0.08,0.5,0.59,0.11,0.19,0.10,0.22,0.17,0.20,0.67,0.13,0.5,0.58,0.10,0.17,0.10,0.65,0.14,0.08,0.36,0.32,0.22,0.65,0.26,0.14,0.27,0.74,0.08,0.33,0.32,0.22,0.14,0.73,0.15,0.68,0.16,0.41,0.14,0.5,0.67,0.67,0.27,0.25,0.30,0.77,0.39,0.14,0.5,0.67,0.15,0.75,0.26,0.07,0.07,0.12,0.5,0.12,0.12,0.06,0.10,0.06,0.06,0.12,0.5,0.5,0.5,0.05,0.09,0.16,0.16,0.10,0.37,0.09,0.5,0.12,0.12,0.12,0.20,0.16,0.16,0.17,0.37,0.14,0.5,0.12,0.12,0.11,0.18,0.28,0.28,0.09,0.37,0.08,0.5,0.5,0.5,0.11,0.17,0.28,0.28,0.15,0.37,0.13,0.5,0.5,0.5,0.10,0.16,0.61,0.10,0.10,0.10,0.37,0.37,0.62,0.18,0.17,0.66,0.09,0.09,0.37,0.37,0.11,0.67,0.06,0.12,0.5,0.06,0.08,0.12,0.12,0.05,0.12,0.5,0.05,0.07,0.5,0.5,0.12,0.5,0.10,0.05,0.08,0.05,0.12,0.12,0.12,0.5,0.08,0.07,0.5,0.5,0.5,0.08,0.5,0.08,0.05,0.65,0.57,0.08,0.05,0.5,0.13,0.5,0.05,0.05,0.11,0.11,0.55,0.15,0.5,0.07,0.06,0.09,0.76,0.07,0.64,0.06,0.11,0.13,0.09,0.78,0.07,0.63,0.08,0.08,0.06,0.55,0.12,0.5,0.07,0.07,0.13,0.15,0.11,0.55,0.14,0.5,0.07,0.05,0.10,0.05,0.05,0.09,0.07,0.08,0.72,0.11,0.70,0.07,0.14,0.06,0.06,0.17,0.14,0.09,0.75,0.11,0.70,0.06,0.11,0.07,0.07,0.08,0.06,0.36,0.36,0.5,0.07,0.07,0.13,0.08,0.08,0.15,0.12,0.33,0.33,0.5,0.07,0.06,0.11,0.09,0.09,0.08,0.07,0.41,0.41,0.09,0.67,0.07,0.12,0.11,0.11,0.15,0.13,0.39,0.39,0.10,0.67,0.05,0.10,0.12,0.12,0.18,0.5,0.19,0.13,0.07,0.12,0.13,0.5,0.5,0.5,0.05,0.10,0.06,0.08,0.24,0.5,0.05,0.21,0.13,0.11,0.18,0.07,0.07,0.14,0.23,0.5,0.09,0.20,0.13,0.09,0.15,0.07,0.09,0.07,0.13,0.59,0.5,0.56,0.09,0.15,0.06,0.11,0.12,0.13,0.58,0.07,0.5,0.56,0.07,0.13,0.06,0.11,0.14,0.12,0.33,0.5,0.26,0.13,0.14,0.24,0.12,0.13,0.24,0.21,0.32,0.5,0.26,0.13,0.13,0.22,0.13,0.15,0.11,0.10,0.22,0.67,0.5,0.60,0.11,0.19,0.10,0.17,0.19,0.17,0.22,0.67,0.5,0.60,0.10,0.17,0.11,0.66,0.14,0.10,0.43,0.33,0.23,0.65,0.26,0.12,0.26,0.73,0.09,0.40,0.33,0.23,0.13,0.73,0.12,0.12,0.5,0.06,0.12,0.12,0.12,0.5,0.05,0.5,0.5,0.05,0.08,0.10,0.54,0.5,0.10,0.39,0.13,0.05,0.11,0.08,0.13,0.81,0.08,0.25,0.67,0.67,0.15,0.49,0.5,0.67,0.64,0.24,0.16,0.22,0.27,0.75,0.45,0.5,0.67,0.12,0.71,0.15,0.23,0.14,0.60,0.10,0.14,0.5,0.5,0.60,0.16,0.14,0.17,0.66,0.14,0.5,0.5,0.10,0.65,0.18,0.5,0.19,0.13,0.07,0.12,0.13,0.5,0.5,0.5,0.05,0.10,0.06,0.08,0.24,0.5,0.05,0.21,0.13,0.11,0.18,0.07,0.07,0.14,0.23,0.5,0.08,0.20,0.13,0.09,0.15,0.07,0.09,0.07,0.13,0.59,0.5,0.56,0.09,0.15,0.06,0.10,0.12,0.13,0.58,0.07,0.5,0.56,0.07,0.13,0.06,0.11,0.14,0.12,0.32,0.5,0.26,0.13,0.14,0.24,0.12,0.13,0.24,0.21,0.32,0.5,0.26,0.13,0.13,0.21,0.13,0.15,0.11,0.10,0.22,0.67,0.5,0.60,0.11,0.19,0.10,0.17,0.19,0.17,0.22,0.67,0.5,0.59,0.10,0.17,0.11,0.65,0.14,0.10,0.43,0.33,0.23,0.65,0.26,0.12,0.26,0.73,0.09,0.40,0.33,0.23,0.13,0.73,0.12,0.67,0.15,0.49,0.16,0.5,0.67,0.64,0.24,0.22,0.27,0.75,0.46,0.15,0.5,0.67,0.12,0.71,0.23,0.05,0.05,0.12,0.5,0.12,0.12,0.05,0.09,0.12,0.5,0.5,0.5,0.08,0.12,0.12,0.06,0.12,0.5,0.12,0.12,0.08,0.14,0.12,0.12,0.10,0.12,0.5,0.08,0.12,0.12,0.07,0.12,0.10,0.10,0.05,0.12,0.5,0.5,0.5,0.07,0.12,0.10,0.10,0.09,0.12,0.5,0.07,0.5,0.5,0.06,0.10,0.14,0.14,0.12,0.11,0.37,0.5,0.13,0.13,0.13,0.21,0.15,0.15,0.20,0.18,0.37,0.5,0.13,0.13,0.12,0.19,0.25,0.25,0.11,0.10,0.37,0.5,0.5,0.5,0.11,0.18,0.26,0.26,0.17,0.16,0.37,0.5,0.5,0.5,0.10,0.16,0.62,0.11,0.13,0.13,0.37,0.37,0.65,0.21,0.18,0.67,0.12,0.12,0.37,0.37,0.14,0.70,0.12,0.5,0.05,0.06,0.12,0.12,0.12,0.5,0.05,0.5,0.5,0.12,0.5,0.06,0.12,0.12,0.12,0.5,0.05,0.05,0.5,0.5,0.5,0.5,0.07,0.57,0.56,0.07,0.5,0.07,0.5,0.05,0.08,0.08,0.5,0.07,0.5,0.06,0.05,0.64,0.05,0.59,0.08,0.08,0.63,0.57,0.05,0.05,0.5,0.11,0.5,0.05,0.06,0.10,0.11,0.07,0.5,0.11,0.5,0.08,0.06,0.07,0.70,0.07,0.63,0.05,0.10,0.11,0.08,0.07,0.70,0.06,0.62,0.07,0.07,0.05,0.5,0.09,0.5,0.06,0.07,0.12,0.13,0.10,0.5,0.10,0.5,0.05,0.05,0.09,0.07,0.06,0.07,0.67,0.09,0.66,0.06,0.11,0.14,0.11,0.07,0.67,0.08,0.65,0.05,0.09,0.07,0.06,0.43,0.43,0.5,0.05,0.07,0.12,0.06,0.06,0.13,0.11,0.40,0.40,0.5,0.05,0.06,0.10,0.06,0.06,0.07,0.05,0.49,0.49,0.08,0.63,0.06,0.10,0.08,0.08,0.12,0.10,0.45,0.46,0.07,0.63,0.05,0.09,0.09,0.09,0.19,0.5,0.22,0.13,0.06,0.11,0.13,0.5,0.5,0.56,0.05,0.09,0.07,0.21,0.5,0.21,0.13,0.09,0.16,0.05,0.12,0.20,0.5,0.06,0.20,0.13,0.07,0.13,0.05,0.05,0.13,0.56,0.5,0.56,0.08,0.13,0.10,0.13,0.56,0.05,0.5,0.55,0.06,0.11,0.11,0.09,0.26,0.5,0.23,0.13,0.12,0.20,0.07,0.05,0.18,0.15,0.26,0.5,0.23,0.13,0.10,0.18,0.07,0.06,0.09,0.07,0.13,0.60,0.5,0.58,0.09,0.16,0.06,0.07,0.15,0.13,0.13,0.60,0.5,0.57,0.08,0.14,0.06,0.08,0.14,0.13,0.33,0.5,0.26,0.13,0.14,0.23,0.11,0.09,0.24,0.22,0.33,0.5,0.26,0.13,0.13,0.21,0.12,0.11,0.11,0.10,0.23,0.67,0.5,0.60,0.11,0.18,0.09,0.12,0.19,0.17,0.23,0.67,0.5,0.60,0.10,0.17,0.10,0.65,0.13,0.13,0.5,0.33,0.24,0.59,0.23,0.09,0.26,0.73,0.12,0.5,0.33,0.24,0.13,0.69,0.10,0.12,0.5,0.05,0.18,0.13,0.12,0.5,0.39,0.55,0.39,0.25,0.5,0.05,0.13,0.67,0.05,0.06,0.61,0.64,0.12,0.5,0.5,0.64,0.51,0.20,0.20,0.15,0.24,0.71,0.5,0.5,0.64,0.12,0.61,0.18,0.17,0.16,0.60,0.10,0.16,0.5,0.5,0.62,0.17,0.15,0.16,0.65,0.15,0.5,0.5,0.11,0.66,0.19,0.5,0.22,0.13,0.06,0.11,0.13,0.5,0.5,0.56,0.05,0.09,0.07,0.21,0.5,0.21,0.13,0.09,0.16,0.05,0.12,0.20,0.5,0.06,0.20,0.13,0.07,0.13,0.05,0.05,0.13,0.56,0.5,0.56,0.08,0.13,0.10,0.13,0.56,0.05,0.5,0.55,0.06,0.11,0.11,0.09,0.26,0.5,0.23,0.13,0.12,0.20,0.07,0.05,0.18,0.15,0.26,0.5,0.23,0.13,0.10,0.18,0.08,0.06,0.09,0.07,0.13,0.60,0.5,0.58,0.09,0.16,0.06,0.07,0.15,0.13,0.13,0.59,0.5,0.57,0.08,0.14,0.06,0.08,0.14,0.13,0.33,0.5,0.26,0.13,0.14,0.23,0.11,0.09,0.24,0.21,0.33,0.5,0.26,0.13,0.13,0.21,0.12,0.11,0.11,0.10,0.23,0.67,0.5,0.60,0.11,0.18,0.09,0.12,0.19,0.17,0.23,0.67,0.5,0.60,0.10,0.17,0.10,0.65,0.13,0.13,0.5,0.33,0.24,0.59,0.23,0.09,0.26,0.73,0.12,0.5,0.33,0.24,0.13,0.69,0.10,0.64,0.12,0.5,0.20,0.5,0.64,0.51,0.20,0.15,0.24,0.71,0.5,0.18,0.5,0.64,0.12,0.61,0.17,0.12,0.5,0.12,0.12,0.05,0.08,0.12,0.5,0.5,0.5,0.07,0.07,0.07,0.05,0.12,0.5,0.12,0.12,0.08,0.13,0.07,0.07,0.09,0.12,0.5,0.06,0.12,0.12,0.07,0.11,0.06,0.06,0.12,0.5,0.5,0.5,0.07,0.11,0.06,0.06,0.08,0.12,0.5,0.05,0.5,0.5,0.06,0.09,0.12,0.12,0.08,0.07,0.13,0.5,0.13,0.13,0.09,0.15,0.13,0.13,0.14,0.12,0.13,0.5,0.13,0.13,0.09,0.14,0.10,0.10,0.07,0.06,0.13,0.5,0.5,0.5,0.08,0.13,0.11,0.11,0.12,0.10,0.13,0.5,0.5,0.5,0.07,0.12,0.12,0.12,0.13,0.12,0.37,0.5,0.13,0.13,0.14,0.22,0.12,0.12,0.21,0.19,0.37,0.5,0.13,0.13,0.14,0.21,0.22,0.22,0.11,0.10,0.37,0.5,0.5,0.5,0.12,0.18,0.23,0.23,0.18,0.16,0.37,0.5,0.5,0.5,0.11,0.17,0.65,0.14,0.18,0.18,0.36,0.36,0.71,0.27,0.21,0.70,0.16,0.16,0.36,0.36,0.21,0.78,0.12,0.5,0.05,0.12,0.12,0.12,0.5,0.5,0.5,0.12,0.5,0.05,0.18,0.13,0.12,0.5,0.39,0.55,0.5,0.5,0.05,0.07,0.56,0.55,0.07,0.5,0.05,0.5,0.05,0.08,0.07,0.5,0.5,0.06,0.59,0.05,0.58,0.07,0.07,0.57,0.56,0.05,0.05,0.5,0.07,0.5,0.05,0.08,0.08,0.06,0.5,0.06,0.5,0.07,0.05,0.63,0.06,0.60,0.07,0.08,0.05,0.62,0.05,0.58,0.06,0.06,0.5,0.09,0.5,0.06,0.10,0.10,0.08,0.5,0.08,0.5,0.05,0.08,0.05,0.06,0.66,0.08,0.62,0.05,0.09,0.10,0.07,0.05,0.65,0.06,0.60,0.07,0.07,0.05,0.5,0.08,0.5,0.05,0.07,0.11,0.12,0.09,0.5,0.07,0.5,0.06,0.09,0.06,0.05,0.05,0.63,0.08,0.64,0.06,0.10,0.11,0.09,0.05,0.63,0.07,0.62,0.05,0.08,0.07,0.06,0.5,0.5,0.5,0.05,0.08,0.12,0.12,0.10,0.5,0.5,0.5,0.07,0.10,0.06,0.05,0.5,0.5,0.07,0.62,0.07,0.10,0.06,0.06,0.10,0.09,0.5,0.5,0.06,0.61,0.06,0.09,0.06,0.06,0.22,0.5,0.43,0.05,0.09,0.13,0.56,0.07,0.38,0.05,0.10,0.06,0.21,0.5,0.23,0.13,0.09,0.15,0.11,0.20,0.5,0.05,0.21,0.12,0.07,0.12,0.05,0.13,0.56,0.36,0.59,0.07,0.12,0.09,0.13,0.55,0.30,0.54,0.05,0.09,0.09,0.07,0.23,0.5,0.25,0.13,0.11,0.19,0.05,0.16,0.13,0.23,0.5,0.24,0.13,0.10,0.16,0.05,0.08,0.06,0.13,0.58,0.5,0.59,0.09,0.15,0.13,0.11,0.13,0.57,0.5,0.58,0.08,0.13,0.12,0.10,0.26,0.5,0.25,0.13,0.12,0.20,0.07,0.20,0.18,0.26,0.5,0.25,0.13,0.11,0.18,0.07,0.09,0.08,0.13,0.60,0.5,0.59,0.10,0.16,0.06,0.16,0.14,0.13,0.60,0.5,0.59,0.09,0.14,0.06,0.06,0.14,0.13,0.33,0.5,0.27,0.13,0.15,0.23,0.09,0.06,0.23,0.21,0.33,0.5,0.26,0.13,0.14,0.21,0.10,0.08,0.11,0.10,0.24,0.64,0.5,0.60,0.12,0.18,0.08,0.09,0.18,0.17,0.24,0.64,0.5,0.60,0.11,0.17,0.08,0.59,0.13,0.18,0.5,0.32,0.24,0.50,0.24,0.06,0.23,0.69,0.16,0.5,0.32,0.24,0.17,0.58,0.06,0.18,0.39,0.5,0.13,0.55,0.46,0.5,0.06,0.5,0.61,0.55,0.51,0.12,0.5,0.5,0.62,0.43,0.21,0.27,0.10,0.20,0.61,0.5,0.5,0.62,0.15,0.50,0.25,0.11,0.20,0.62,0.11,0.20,0.5,0.5,0.65,0.21,0.18,0.17,0.66,0.18,0.5,0.5,0.14,0.70,0.22,0.5,0.43,0.05,0.09,0.13,0.56,0.07,0.38,0.05,0.10,0.06,0.21,0.5,0.23,0.13,0.09,0.15,0.11,0.20,0.5,0.05,0.21,0.12,0.07,0.12,0.05,0.13,0.56,0.36,0.59,0.07,0.12,0.09,0.13,0.55,0.30,0.53,0.05,0.09,0.09,0.07,0.23,0.5,0.25,0.13,0.11,0.19,0.05,0.16,0.13,0.23,0.5,0.24,0.13,0.10,0.16,0.05,0.08,0.06,0.13,0.58,0.5,0.59,0.09,0.15,0.13,0.11,0.13,0.57,0.5,0.58,0.08,0.13,0.12,0.10,0.26,0.5,0.25,0.13,0.12,0.20,0.07,0.20,0.18,0.26,0.5,0.25,0.13,0.11,0.18,0.07,0.09,0.08,0.13,0.60,0.5,0.59,0.10,0.16,0.06,0.16,0.14,0.13,0.60,0.5,0.59,0.09,0.14,0.06,0.06,0.14,0.13,0.33,0.5,0.27,0.13,0.15,0.23,0.09,0.06,0.23,0.21,0.33,0.5,0.26,0.13,0.14,0.21,0.10,0.08,0.11,0.10,0.24,0.64,0.5,0.60,0.12,0.18,0.08,0.09,0.18,0.17,0.24,0.64,0.5,0.60,0.11,0.17,0.08,0.59,0.13,0.18,0.5,0.32,0.24,0.50,0.24,0.06,0.23,0.69,0.16,0.5,0.32,0.24,0.17,0.58,0.06,0.51,0.12,0.5,0.27,0.5,0.62,0.43,0.21,0.10,0.20,0.61,0.5,0.25,0.5,0.62,0.15,0.50,0.11,0.12,0.5,0.12,0.12,0.08,0.12,0.5,0.5,0.5,0.07,0.05,0.05,0.05,0.12,0.5,0.12,0.12,0.07,0.12,0.05,0.05,0.08,0.12,0.5,0.05,0.12,0.12,0.06,0.10,0.12,0.5,0.5,0.5,0.06,0.10,0.07,0.12,0.5,0.5,0.5,0.05,0.08,0.07,0.07,0.08,0.07,0.13,0.5,0.13,0.13,0.09,0.15,0.07,0.08,0.13,0.11,0.13,0.5,0.12,0.12,0.08,0.13,0.06,0.06,0.07,0.06,0.13,0.5,0.5,0.5,0.08,0.12,0.06,0.06,0.11,0.09,0.13,0.5,0.5,0.5,0.07,0.11,0.11,0.11,0.09,0.09,0.13,0.5,0.13,0.13,0.10,0.16,0.12,0.12,0.15,0.14,0.13,0.5,0.13,0.13,0.10,0.15,0.09,0.09,0.08,0.07,0.13,0.5,0.5,0.5,0.09,0.13,0.10,0.10,0.13,0.12,0.13,0.5,0.5,0.5,0.08,0.12,0.09,0.09,0.14,0.14,0.36,0.5,0.13,0.13,0.17,0.24,0.10,0.10,0.22,0.21,0.36,0.5,0.13,0.13,0.17,0.24,0.15,0.15,0.12,0.11,0.36,0.5,0.5,0.5,0.14,0.20,0.17,0.17,0.18,0.17,0.36,0.5,0.5,0.5,0.14,0.20,0.71,0.21,0.24,0.24,0.36,0.36,0.83,0.40,0.27,0.78,0.23,0.23,0.36,0.36,0.35,0.93,0.12,0.5,0.12,0.12,0.12,0.5,0.5,0.5,0.18,0.39,0.5,0.13,0.55,0.46,0.5,0.5,0.06,0.09,0.55,0.55,0.05,0.08,0.05,0.5,0.05,0.5,0.06,0.08,0.07,0.5,0.5,0.05,0.07,0.58,0.06,0.59,0.06,0.07,0.56,0.05,0.57,0.05,0.05,0.5,0.06,0.5,0.06,0.08,0.08,0.06,0.5,0.05,0.5,0.05,0.07,0.60,0.07,0.59,0.06,0.07,0.05,0.58,0.05,0.57,0.05,0.05,0.5,0.08,0.5,0.06,0.09,0.08,0.07,0.5,0.06,0.5,0.05,0.07,0.62,0.07,0.61,0.05,0.07,0.07,0.06,0.60,0.06,0.58,0.06,0.06,0.05,0.5,0.08,0.5,0.08,0.10,0.10,0.08,0.5,0.07,0.5,0.07,0.09,0.05,0.05,0.64,0.09,0.62,0.06,0.09,0.09,0.07,0.62,0.07,0.60,0.06,0.08,0.07,0.06,0.5,0.07,0.5,0.05,0.10,0.13,0.11,0.09,0.5,0.06,0.5,0.09,0.12,0.06,0.05,0.05,0.62,0.10,0.64,0.09,0.11,0.10,0.08,0.61,0.08,0.61,0.08,0.10,0.08,0.07,0.5,0.5,0.5,0.05,0.13,0.17,0.12,0.10,0.5,0.5,0.5,0.13,0.16,0.07,0.06,0.5,0.5,0.09,0.63,0.11,0.14,0.05,0.05,0.10,0.09,0.5,0.5,0.07,0.61,0.11,0.14,0.05,0.05,0.43,0.07,0.5,0.38,0.5,0.05,0.23,0.36,0.5,0.09,0.21,0.30,0.5,0.05,0.13,0.59,0.06,0.55,0.10,0.12,0.54,0.05,0.56,0.09,0.07,0.25,0.5,0.34,0.05,0.07,0.15,0.12,0.24,0.5,0.35,0.06,0.07,0.05,0.13,0.59,0.13,0.42,0.05,0.07,0.12,0.09,0.13,0.58,0.10,0.39,0.06,0.11,0.10,0.25,0.5,0.31,0.07,0.08,0.12,0.05,0.19,0.16,0.25,0.5,0.31,0.06,0.07,0.10,0.05,0.09,0.08,0.13,0.59,0.21,0.45,0.08,0.12,0.15,0.13,0.13,0.59,0.18,0.42,0.07,0.10,0.12,0.11,0.27,0.5,0.29,0.11,0.13,0.19,0.06,0.20,0.18,0.26,0.5,0.28,0.09,0.12,0.17,0.06,0.10,0.09,0.13,0.60,0.32,0.55,0.10,0.17,0.05,0.16,0.14,0.13,0.60,0.27,0.50,0.09,0.15,0.05,0.15,0.14,0.32,0.5,0.32,0.14,0.19,0.27,0.07,0.23,0.21,0.32,0.5,0.30,0.14,0.18,0.25,0.08,0.06,0.12,0.11,0.24,0.62,0.5,0.63,0.15,0.21,0.06,0.06,0.18,0.17,0.24,0.62,0.44,0.63,0.14,0.20,0.06,0.50,0.17,0.24,0.5,0.35,0.25,0.57,0.39,0.05,0.24,0.58,0.23,0.5,0.34,0.24,0.35,0.66,0.05,0.5,0.5,0.46,0.5,0.5,0.5,0.55,0.5,0.43,0.15,0.5,0.5,0.65,0.55,0.41,0.38,0.08,0.21,0.50,0.5,0.5,0.64,0.39,0.65,0.35,0.08,0.27,0.65,0.14,0.27,0.5,0.5,0.72,0.29,0.25,0.21,0.70,0.25,0.5,0.5,0.22,0.79,0.43,0.07,0.5,0.38,0.5,0.05,0.23,0.36,0.5,0.09,0.21,0.30,0.5,0.05,0.13,0.59,0.06,0.56,0.10,0.12,0.53,0.05,0.56,0.09,0.07,0.25,0.5,0.35,0.05,0.07,0.15,0.12,0.24,0.5,0.36,0.06,0.07,0.05,0.13,0.59,0.13,0.42,0.05,0.07,0.12,0.09,0.13,0.58,0.10,0.39,0.06,0.11,0.10,0.25,0.5,0.31,0.07,0.08,0.12,0.05,0.19,0.16,0.25,0.5,0.31,0.06,0.07,0.10,0.05,0.09,0.08,0.13,0.59,0.21,0.45,0.08,0.12,0.15,0.13,0.13,0.59,0.18,0.42,0.07,0.10,0.12,0.11,0.27,0.5,0.29,0.11,0.13,0.19,0.06,0.20,0.18,0.26,0.5,0.28,0.09,0.12,0.17,0.06,0.10,0.09,0.13,0.60,0.32,0.55,0.10,0.17,0.05,0.16,0.14,0.13,0.60,0.27,0.50,0.09,0.15,0.05,0.15,0.14,0.32,0.5,0.32,0.14,0.19,0.27,0.07,0.23,0.21,0.32,0.5,0.30,0.14,0.18,0.25,0.08,0.06,0.12,0.11,0.24,0.62,0.5,0.63,0.15,0.21,0.06,0.06,0.18,0.17,0.24,0.62,0.44,0.63,0.14,0.20,0.06,0.50,0.17,0.24,0.5,0.35,0.25,0.57,0.39,0.05,0.24,0.58,0.23,0.5,0.34,0.24,0.35,0.66,0.05,0.43,0.15,0.5,0.38,0.5,0.65,0.55,0.41,0.08,0.21,0.50,0.5,0.35,0.5,0.64,0.39,0.65,0.08,0.12,0.5,0.12,0.12,0.07,0.12,0.5,0.5,0.5,0.06,0.12,0.5,0.12,0.12,0.07,0.11,0.08,0.12,0.5,0.12,0.12,0.05,0.09,0.12,0.5,0.5,0.5,0.06,0.10,0.07,0.12,0.5,0.5,0.5,0.08,0.05,0.05,0.07,0.06,0.13,0.5,0.13,0.13,0.09,0.14,0.05,0.05,0.12,0.10,0.12,0.5,0.12,0.12,0.08,0.13,0.06,0.05,0.13,0.5,0.5,0.5,0.07,0.12,0.10,0.08,0.12,0.5,0.5,0.5,0.07,0.11,0.07,0.07,0.09,0.08,0.13,0.5,0.13,0.13,0.10,0.16,0.07,0.07,0.15,0.13,0.13,0.5,0.13,0.13,0.09,0.15,0.06,0.06,0.08,0.07,0.13,0.5,0.5,0.5,0.08,0.13,0.06,0.06,0.12,0.11,0.13,0.5,0.5,0.5,0.08,0.12,0.09,0.09,0.10,0.10,0.13,0.5,0.13,0.13,0.12,0.17,0.10,0.10,0.16,0.15,0.13,0.5,0.13,0.13,0.12,0.17,0.08,0.08,0.09,0.08,0.13,0.5,0.5,0.5,0.10,0.14,0.08,0.08,0.13,0.12,0.13,0.5,0.5,0.5,0.10,0.14,0.06,0.06,0.17,0.17,0.36,0.5,0.13,0.13,0.23,0.30,0.06,0.06,0.24,0.24,0.36,0.5,0.13,0.13,0.24,0.31,0.10,0.10,0.14,0.14,0.36,0.5,0.5,0.5,0.19,0.25,0.11,0.11,0.20,0.20,0.36,0.5,0.5,0.5,0.20,0.26,0.83,0.35,0.32,0.32,0.38,0.38,0.93,0.43,0.40,0.93,0.30,0.30,0.38,0.38,0.5,1,0.12,0.5,0.12,0.12,0.12,0.5,0.5,0.5,0.5,0.5,0.46,0.5,0.5,0.55,0.11,0.28,0.37,0.55,0.16,0.86,0.20,0.27,0.06,0.5,0.06,0.58,0.08,0.19,0.26,0.09,0.5,0.05,0.57,0.07,0.18,0.26,0.06,0.05,0.59,0.25,0.75,0.12,0.16,0.08,0.57,0.21,0.72,0.12,0.16,0.05,0.06,0.05,0.5,0.07,0.58,0.08,0.18,0.24,0.08,0.07,0.5,0.05,0.57,0.07,0.17,0.24,0.59,0.23,0.73,0.11,0.15,0.06,0.05,0.57,0.20,0.70,0.11,0.15,0.06,0.05,0.5,0.07,0.58,0.08,0.20,0.27,0.08,0.07,0.5,0.06,0.57,0.07,0.20,0.26,0.61,0.24,0.74,0.13,0.17,0.06,0.05,0.58,0.21,0.71,0.12,0.16,0.06,0.05,0.5,0.09,0.59,0.09,0.27,0.31,0.09,0.07,0.5,0.07,0.58,0.08,0.26,0.30,0.05,0.62,0.28,0.78,0.18,0.23,0.07,0.06,0.60,0.24,0.74,0.17,0.22,0.08,0.07,0.5,0.10,0.62,0.12,0.33,0.39,0.10,0.09,0.5,0.08,0.59,0.11,0.33,0.38,0.06,0.06,0.05,0.64,0.35,0.86,0.29,0.36,0.09,0.08,0.61,0.26,0.81,0.28,0.36,0.10,0.09,0.5,0.09,0.63,0.18,0.44,0.48,0.13,0.12,0.5,0.07,0.60,0.15,0.46,0.5,0.09,0.08,0.05,0.63,0.36,1,0.45,0.48,0.11,0.10,0.61,0.28,0.93,0.46,0.5,0.13,0.13,0.5,0.5,0.62,0.20,0.44,0.44,0.05,0.05,0.17,0.16,0.5,0.5,0.59,0.16,0.5,0.5,0.05,0.05,0.11,0.11,0.5,0.5,0.28,0.97,0.44,0.44,0.07,0.07,0.14,0.14,0.5,0.5,0.22,0.88,0.5,0.5,0.07,0.07,0.5,0.5,0.06,0.09,0.5,0.08,0.64,0.06,0.5,0.06,0.5,0.05,0.07,0.5,0.05,0.5,0.06,0.55,0.07,0.57,0.07,0.56,0.06,0.56,0.07,0.34,0.13,0.5,0.05,0.10,0.35,0.10,0.5,0.10,0.42,0.08,0.58,0.11,0.39,0.07,0.57,0.11,0.05,0.31,0.21,0.5,0.05,0.07,0.13,0.07,0.06,0.31,0.18,0.5,0.06,0.13,0.05,0.07,0.45,0.10,0.60,0.05,0.14,0.07,0.06,0.06,0.42,0.09,0.59,0.14,0.08,0.07,0.29,0.32,0.5,0.07,0.10,0.16,0.12,0.10,0.28,0.27,0.5,0.07,0.09,0.16,0.08,0.07,0.11,0.55,0.14,0.64,0.05,0.07,0.17,0.12,0.10,0.09,0.50,0.12,0.62,0.05,0.07,0.17,0.13,0.12,0.32,0.5,0.55,0.06,0.15,0.19,0.19,0.19,0.17,0.30,0.44,0.55,0.05,0.15,0.18,0.19,0.10,0.09,0.14,0.63,0.22,0.60,0.12,0.14,0.15,0.17,0.15,0.14,0.63,0.18,0.62,0.11,0.14,0.18,0.19,0.18,0.35,0.5,0.50,0.12,0.33,0.40,0.17,0.27,0.25,0.34,0.5,0.50,0.10,0.34,0.41,0.18,0.05,0.15,0.14,0.25,0.65,0.41,0.71,0.26,0.33,0.13,0.05,0.21,0.20,0.24,0.64,0.35,0.66,0.27,0.34,0.14,0.57,0.35,0.32,0.5,0.47,0.26,0.63,0.42,0.10,0.39,0.66,0.30,0.5,0.44,0.26,0.5,0.71,0.10,0.5,0.05,0.08,0.5,0.5,0.05,0.07,0.61,0.5,0.5,0.5,0.5,0.55,0.39,0.5,0.47,0.90,0.59,0.41,0.5,0.20,0.41,0.65,0.5,0.45,0.86,0.5,0.68,0.48,0.19,0.38,0.72,0.22,0.38,0.5,0.5,0.87,0.46,0.35,0.29,0.79,0.35,0.5,0.5,0.40,1,0.5,0.5,0.06,0.09,0.5,0.08,0.64,0.06,0.5,0.06,0.5,0.05,0.07,0.5,0.05,0.5,0.06,0.56,0.07,0.57,0.07,0.56,0.06,0.56,0.07,0.35,0.13,0.5,0.05,0.10,0.36,0.10,0.5,0.10,0.42,0.08,0.58,0.11,0.39,0.07,0.57,0.11,0.05,0.31,0.21,0.5,0.05,0.07,0.13,0.07,0.06,0.31,0.18,0.5,0.06,0.13,0.05,0.07,0.45,0.10,0.60,0.05,0.14,0.07,0.06,0.06,0.42,0.09,0.59,0.14,0.08,0.07,0.29,0.32,0.5,0.07,0.10,0.16,0.12,0.10,0.28,0.27,0.5,0.07,0.09,0.16,0.08,0.07,0.11,0.55,0.14,0.64,0.05,0.07,0.17,0.12,0.10,0.09,0.50,0.12,0.62,0.05,0.07,0.17,0.13,0.12,0.32,0.5,0.55,0.06,0.15,0.19,0.19,0.19,0.17,0.30,0.44,0.55,0.05,0.15,0.18,0.19,0.10,0.09,0.14,0.63,0.22,0.60,0.12,0.14,0.15,0.17,0.15,0.14,0.63,0.18,0.62,0.11,0.14,0.18,0.19,0.18,0.35,0.5,0.50,0.12,0.33,0.40,0.17,0.27,0.25,0.34,0.5,0.50,0.10,0.34,0.41,0.18,0.05,0.15,0.14,0.25,0.65,0.41,0.71,0.26,0.33,0.13,0.05,0.21,0.20,0.24,0.64,0.35,0.66,0.27,0.34,0.14,0.57,0.35,0.32,0.5,0.47,0.26,0.63,0.42,0.10,0.39,0.66,0.30,0.5,0.44,0.26,0.5,0.71,0.10,0.55,0.39,0.5,0.49,0.47,0.90,0.59,0.41,0.20,0.41,0.65,0.5,0.48,0.45,0.86,0.5,0.68,0.19,0.12,0.5,0.12,0.5,0.12,0.5,0.07,0.12,0.5,0.12,0.5,0.06,0.12,0.5,0.07,0.05,0.13,0.5,0.11,0.09,0.12,0.5,0.06,0.13,0.5,0.10,0.08,0.12,0.5,0.05,0.05,0.09,0.08,0.13,0.5,0.05,0.05,0.14,0.13,0.13,0.5,0.07,0.07,0.13,0.5,0.07,0.07,0.12,0.11,0.13,0.5,0.06,0.06,0.06,0.06,0.10,0.09,0.13,0.5,0.05,0.06,0.06,0.06,0.16,0.15,0.13,0.5,0.05,0.06,0.05,0.05,0.08,0.08,0.13,0.5,0.12,0.12,0.05,0.05,0.05,0.13,0.12,0.13,0.5,0.11,0.11,0.05,0.07,0.07,0.12,0.12,0.13,0.5,0.05,0.05,0.12,0.15,0.08,0.08,0.17,0.17,0.13,0.5,0.05,0.05,0.13,0.16,0.06,0.06,0.10,0.10,0.13,0.5,0.22,0.22,0.10,0.13,0.06,0.06,0.14,0.14,0.13,0.5,0.19,0.19,0.11,0.13,0.05,0.05,0.23,0.24,0.38,0.5,0.11,0.11,0.32,0.39,0.05,0.05,0.30,0.31,0.38,0.5,0.10,0.10,0.36,0.44,0.08,0.08,0.19,0.20,0.38,0.5,0.42,0.42,0.29,0.35,0.08,0.08,0.25,0.26,0.38,0.5,0.38,0.38,0.33,0.40,0.93,0.5,0.27,0.27,0.40,0.44,0.80,0.40,0.43,1,0.24,0.24,0.40,0.43,0.5,0.84,0.12,0.5,0.12,0.5,0.5,0.05,0.08,0.5,0.5,0.05,0.07,0.61,0.55,0.16,0.81,0.06,0.21,0.68,0.11,0.86,0.81,0.15,0.49,1,0.28,0.58,0.25,0.06,0.15,0.92,0.15,0.5,0.23,0.37,0.57,0.21,0.92,0.15,0.48,0.07,0.11,0.30,0.20,0.08,0.75,0.21,0.49,0.67,0.15,0.5,0.16,0.27,0.07,0.72,0.67,0.15,0.5,0.24,0.36,0.23,0.19,0.18,0.58,0.23,0.15,0.15,0.85,0.15,0.5,0.26,0.26,0.57,0.20,0.15,0.15,0.85,0.15,0.5,0.12,0.12,0.08,0.73,0.5,0.5,0.60,0.15,0.5,0.16,0.16,0.07,0.70,0.48,0.5,0.60,0.15,0.5,0.18,0.17,0.58,0.24,0.15,0.15,0.85,0.15,0.5,0.24,0.24,0.57,0.21,0.15,0.15,0.85,0.15,0.5,0.11,0.11,0.08,0.74,0.5,0.5,0.60,0.15,0.5,0.15,0.15,0.07,0.71,0.5,0.5,0.60,0.15,0.5,0.20,0.20,0.59,0.28,0.15,0.15,0.92,0.15,0.5,0.27,0.26,0.58,0.24,0.15,0.15,0.92,0.15,0.49,0.13,0.12,0.09,0.78,0.5,0.5,0.65,0.15,0.5,0.17,0.16,0.08,0.74,0.5,0.5,0.65,0.16,0.5,0.27,0.26,0.62,0.35,0.15,0.15,1,0.16,0.48,0.31,0.30,0.59,0.26,0.15,0.16,1,0.14,0.42,0.18,0.17,0.12,0.86,0.5,0.5,0.76,0.16,0.5,0.23,0.22,0.11,0.81,0.49,0.5,0.76,0.16,0.5,0.33,0.33,0.63,0.36,0.16,0.16,1,0.12,0.32,0.39,0.38,0.60,0.28,0.14,0.16,1,0.11,0.31,0.29,0.28,0.18,1,0.48,0.5,0.95,0.16,0.45,0.36,0.36,0.15,0.93,0.42,0.5,0.95,0.17,0.46,0.44,0.46,0.62,0.28,0.12,0.16,0.94,0.07,0.13,0.48,0.5,0.59,0.22,0.11,0.17,0.94,0.06,0.12,0.45,0.46,0.20,0.97,0.32,0.45,0.94,0.11,0.21,0.48,0.5,0.16,0.88,0.31,0.46,0.94,0.11,0.20,0.44,0.5,0.5,0.5,0.07,0.11,0.59,0.44,0.5,0.5,0.5,0.06,0.11,0.59,0.44,0.5,0.5,0.5,0.13,0.21,0.47,0.44,0.5,0.5,0.5,0.12,0.20,0.47,0.5,0.08,0.73,0.08,0.30,0.70,0.64,0.73,0.14,0.5,0.87,0.06,0.5,0.07,0.05,0.08,0.14,0.53,0.14,0.5,0.09,0.5,0.06,0.08,0.53,0.14,0.5,0.09,0.13,0.57,0.30,0.5,0.41,0.14,0.5,0.06,0.56,0.05,0.41,0.14,0.5,0.31,0.47,0.5,0.08,0.14,0.14,0.48,0.13,0.5,0.05,0.5,0.07,0.14,0.14,0.48,0.14,0.5,0.58,0.5,0.5,0.38,0.13,0.5,0.57,0.5,0.5,0.38,0.14,0.5,0.5,0.10,0.13,0.13,0.49,0.14,0.5,0.05,0.5,0.09,0.14,0.14,0.49,0.14,0.5,0.60,0.5,0.5,0.39,0.14,0.5,0.59,0.5,0.5,0.39,0.14,0.5,0.05,0.5,0.14,0.14,0.14,0.53,0.14,0.5,0.07,0.06,0.5,0.12,0.14,0.14,0.53,0.14,0.5,0.64,0.5,0.5,0.42,0.14,0.5,0.05,0.62,0.5,0.5,0.42,0.14,0.5,0.07,0.07,0.55,0.22,0.14,0.14,0.61,0.14,0.5,0.10,0.09,0.55,0.18,0.14,0.14,0.61,0.14,0.5,0.05,0.05,0.06,0.60,0.5,0.5,0.47,0.14,0.5,0.07,0.07,0.05,0.62,0.5,0.5,0.47,0.14,0.5,0.15,0.15,0.50,0.41,0.14,0.14,0.83,0.15,0.5,0.19,0.18,0.50,0.35,0.14,0.14,0.83,0.15,0.5,0.12,0.11,0.12,0.71,0.5,0.5,0.64,0.15,0.5,0.14,0.14,0.10,0.66,0.5,0.5,0.64,0.15,0.5,0.05,0.33,0.34,0.47,0.47,0.15,0.15,1,0.13,0.20,0.05,0.40,0.41,0.44,0.45,0.15,0.15,1,0.14,0.21,0.07,0.26,0.27,0.26,0.90,0.5,0.5,0.79,0.14,0.21,0.07,0.33,0.34,0.26,0.86,0.5,0.5,0.79,0.15,0.23,0.63,0.5,0.27,0.13,0.14,0.51,0.42,0.71,0.24,0.14,0.15,0.51,0.5,0.07,0.70,0.09,0.31,0.71,0.61,0.87,0.13,0.47,0.71,0.06,0.5,0.5,0.05,0.5,0.5,0.59,0.5,0.20,0.21,0.41,0.32,0.41,0.68,0.21,0.23,0.41,0.28,0.5,0.87,0.40,0.49,0.5,0.5,0.89,0.42,0.48,0.46,1,0.48,0.5,0.5,0.5,0.98,0.5,0.08,0.73,0.08,0.30,0.70,0.64,0.73,0.14,0.5,0.87,0.06,0.5,0.07,0.05,0.08,0.14,0.53,0.14,0.5,0.09,0.5,0.06,0.08,0.53,0.14,0.5,0.09,0.13,0.57,0.30,0.5,0.41,0.14,0.5,0.06,0.56,0.05,0.41,0.14,0.5,0.31,0.47,0.5,0.08,0.14,0.14,0.48,0.13,0.5,0.05,0.5,0.07,0.14,0.14,0.48,0.14,0.5,0.58,0.5,0.5,0.38,0.13,0.5,0.57,0.5,0.5,0.38,0.14,0.5,0.5,0.10,0.13,0.13,0.49,0.14,0.5,0.05,0.5,0.09,0.14,0.14,0.49,0.14,0.5,0.60,0.5,0.5,0.39,0.14,0.5,0.59,0.5,0.5,0.39,0.14,0.5,0.05,0.5,0.14,0.14,0.14,0.53,0.14,0.5,0.07,0.06,0.5,0.12,0.14,0.14,0.53,0.14,0.5,0.64,0.5,0.5,0.42,0.14,0.5,0.05,0.62,0.5,0.5,0.42,0.14,0.5,0.07,0.07,0.55,0.22,0.14,0.14,0.61,0.14,0.5,0.10,0.09,0.55,0.18,0.14,0.14,0.61,0.14,0.5,0.05,0.05,0.06,0.60,0.5,0.5,0.47,0.14,0.5,0.07,0.07,0.05,0.62,0.5,0.5,0.47,0.14,0.5,0.15,0.15,0.50,0.41,0.14,0.14,0.83,0.15,0.5,0.19,0.18,0.50,0.35,0.14,0.14,0.83,0.15,0.5,0.12,0.11,0.12,0.71,0.5,0.5,0.64,0.15,0.5,0.14,0.14,0.10,0.66,0.5,0.5,0.64,0.15,0.5,0.05,0.33,0.34,0.47,0.47,0.15,0.15,1,0.13,0.20,0.05,0.40,0.41,0.44,0.45,0.15,0.15,1,0.14,0.21,0.07,0.26,0.27,0.26,0.90,0.5,0.5,0.79,0.14,0.21,0.07,0.33,0.34,0.26,0.86,0.5,0.5,0.79,0.15,0.23,0.63,0.5,0.27,0.13,0.14,0.51,0.42,0.71,0.24,0.14,0.15,0.51,0.59,0.5,0.20,0.21,0.41,0.32,0.41,0.68,0.21,0.23,0.41,0.28,0.62,0.13,0.5,0.66,0.62,0.13,0.5,0.54,0.07,0.07,0.13,0.13,0.34,0.13,0.5,0.06,0.06,0.34,0.13,0.5,0.13,0.13,0.07,0.07,0.5,0.5,0.28,0.13,0.5,0.07,0.07,0.28,0.13,0.5,0.5,0.5,0.10,0.10,0.13,0.13,0.36,0.13,0.5,0.10,0.10,0.13,0.13,0.36,0.13,0.5,0.11,0.11,0.5,0.5,0.30,0.13,0.5,0.11,0.11,0.5,0.5,0.30,0.13,0.5,0.13,0.13,0.07,0.13,0.13,0.38,0.13,0.5,0.13,0.13,0.06,0.13,0.13,0.38,0.13,0.5,0.14,0.14,0.07,0.5,0.5,0.32,0.13,0.5,0.14,0.14,0.06,0.5,0.5,0.32,0.13,0.5,0.16,0.16,0.12,0.13,0.13,0.43,0.13,0.5,0.16,0.16,0.11,0.13,0.13,0.43,0.13,0.5,0.17,0.17,0.12,0.5,0.5,0.35,0.13,0.5,0.17,0.17,0.11,0.5,0.5,0.35,0.13,0.5,0.19,0.19,0.05,0.05,0.05,0.22,0.13,0.13,0.51,0.13,0.5,0.19,0.19,0.06,0.06,0.05,0.19,0.13,0.13,0.51,0.13,0.5,0.15,0.15,0.05,0.22,0.5,0.5,0.41,0.13,0.5,0.18,0.18,0.05,0.05,0.05,0.19,0.5,0.5,0.41,0.13,0.5,0.17,0.17,0.12,0.13,0.11,0.42,0.13,0.13,0.72,0.14,0.5,0.18,0.18,0.15,0.16,0.10,0.38,0.13,0.13,0.72,0.14,0.5,0.13,0.13,0.10,0.11,0.11,0.42,0.5,0.5,0.58,0.14,0.5,0.14,0.14,0.13,0.13,0.10,0.38,0.5,0.5,0.58,0.14,0.5,0.10,0.10,0.32,0.36,0.40,0.14,0.14,1,0.19,0.45,0.18,0.10,0.10,0.39,0.44,0.40,0.14,0.14,1,0.20,0.46,0.19,0.20,0.20,0.29,0.33,0.44,0.5,0.5,0.85,0.21,0.5,0.20,0.19,0.19,0.35,0.40,0.43,0.5,0.5,0.85,0.22,0.5,0.21,0.80,0.5,0.19,0.21,0.45,0.40,0.84,0.20,0.22,0.45,0.66,0.13,0.5,0.61,0.54,0.13,0.5,0.61,0.5,0.07,0.70,0.09,0.31,0.71,0.61,0.87,0.13,0.47,0.71,0.68,0.07,0.24,0.70,0.5,0.13,1,0.11,0.36,0.70,0.06,0.70,0.23,0.30,0.5,0.5,0.06,0.16,0.23,0.5,0.13,0.70,0.32,0.89,0.5,0.32,0.45,0.5,0.68,0.39,0.28,0.42,0.98,0.28,0.46,0.5,0.5,0.75,0.18,0.20,0.68,0.5,0.37,0.19,0.21,0.39,0.75,0.37};
     int aggregates[740];
     for (int i = 0; i < n ; i++){
         aggregates[i] = 0;
     }
     for (int i = 0 ; i < 10000 ; i++){
         for (int i = 0; i < n ; i++){
             aggregates[i] = 0;
         } 
         getAggregation(aggregates, 4, rowStarts, colIdx , vals, n, nnz);
     }
     system("PAUSE");
     return EXIT_SUCCESS;
}

*/
